Catch vs Catch(例外e)和Throw vs Throw e

这两个代码示例是否相同? Catch and Catch(Exception e)具有相同的输出,如果我写ThrowThrow e ,结果也是相同的。

主要:

try { A(); //B(); } catch (Exception e) { Console.WriteLine("{0} exception caught.", e); } 

代码1:

 static void A() { try { int value = 1 / int.Parse("0"); } catch (Exception e) { throw e; } } 

代码2:

 static void A() { // Rethrow syntax. try { int value = 1 / int.Parse("0"); } catch { throw; } } 

我想这里有两个问题。


throwthrow e;什么区别throw e;

我认为没有一个很好的理由来写catch (Exception e) { throw e; } catch (Exception e) { throw e; } 。 这会丢失原始的堆栈跟踪。 当你使用throw; 保留原始堆栈跟踪。 这很好,因为这意味着更容易找到错误的原因。


catchcatch (Exception e)之间有什么区别catch (Exception e)

你的两个例子都是相同的,同样没用 – 它们只是捕获exception,然后重新抛出它。 一个小的区别是第一个示例将生成编译器警告。

变量’e’已声明但从未使用过

如果你在catch块中有一些其他代码实际上做了一些有用的事情,那么问这个问题会更有意义。 例如,您可能希望记录exception:

 try { int value = 1 / int.Parse("0"); } catch (Exception e) { LogException(e); throw; } 

现在有必要使用第一个版本,以便您可以引用捕获的exception。

如果您的catch块实际上没有使用exception,那么您可能希望使用第二个版本来避免编译器警告。

如果我们忽略“未使用的变量”警告,那么唯一的时间就存在实际差异

 catch {...} 

 catch(Exception ex) {...} 

当一些非C#代码抛出非Exceptionexception时。 C ++可以抛出任何东西 。 在.NET 1.1中,您必须使用catch (no (Exception ex) )来处理这些exceptionexception。 然而,这是有问题的 – 尤其是,你无法看到抛出的东西! 因此,在.NET 2.0及更高版本中,这是默认包装,因此即使C ++抛出一个string – 您也将其视为Exception子类。 请注意,可以通过配置设置禁用此function,但是:请勿执行此操作。 不要管它!

throw;的问题throw; vs throw ex; 已经提到过,并且涉及堆栈跟踪。 您可以在两种情况下都使用throw ,从而保留原始堆栈跟踪。