这两个代码示例是否相同? Catch 和 Catch (Exception e) 的输出是一样的,如果我写 Throw 或 Throw 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;
}
}
最佳答案
我认为这里有两个问题。
throw
和 throw e;
有什么区别?
我不认为有什么好的理由写catch (Exception e) { throw e; }
。这会丢失原始堆栈跟踪。当您使用 throw;
时,原始堆栈跟踪将被保留。这很好,因为这意味着错误的原因更容易找到。
catch
和 catch (Exception e)
有什么区别?
你的两个例子都是一样的,同样没用——它们只是捕捉到一个异常,然后重新抛出它。一个细微差别是第一个示例将生成编译器警告。
The variable 'e' is declared but never used
如果您的 catch block 中有一些其他代码实际上做了一些有用的事情,那么问这个问题就更有意义了。例如,您可能想要记录异常:
try
{
int value = 1 / int.Parse("0");
}
catch (Exception e)
{
LogException(e);
throw;
}
现在有必要使用第一个版本,以便您可以引用捕获的异常。
如果您的 catch block 实际上没有使用异常,那么您可能希望使用第二个版本来避免编译器警告。
关于c# - Catch vs Catch(异常 e)和 Throw vs Throw e,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805987/