允许使用自定义异常,其中可以抛出异常,如下所示。
try
{
int foo = int.Parse(token);
}
catch (FormatException ex)
{
//Assuming you added this constructor
throw new ParserException(
$"Failed to read {token} as number.",
FileName,
LineNumber,
ex);
}
但是在正常的try catch块中,抛出异常会清除堆栈跟踪。
try
{
ForthCall();
}
catch (Exception ex)
{
throw ex;
}
所以在自定义异常中,它如何设法使用throw异常,而不清除堆栈跟踪?
答案 0 :(得分:1)
有几种方法可以做到。
正如此链接In C#, how can I rethrow InnerException without losing stack trace?中所述,您可以使用ExceptionDispatchInfo Class 代码类似于
try
{
task.Wait();
}
catch(AggregateException ex)
{
ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
另一种方法是让你的处理程序返回一个布尔值,无论是否处理了异常,所以你可以在catch子句中使用它:
catch (Exception ex) {
if (!HandleException(ex)) {
throw;
}
}
其中HandleException
是您的自定义异常处理程序。来自此链接:How to throw exception without resetting stack trace?
答案 1 :(得分:0)
每当您将throw
与异常对象一起使用时,它就会在该点填充堆栈跟踪。 (与Java相比,它在构造异常时填充堆栈跟踪。)
如果使用throw
而没有异常对象(只能在catch
子句中执行),则会重新抛出捕获的异常对象而不进行更改。