自定义异常 - 尝试catch-in c#

时间:2016-08-29 04:36:23

标签: c# .net exception-handling

允许使用自定义异常,其中可以抛出异常,如下所示。

  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异常,而不清除堆栈跟踪?

2 个答案:

答案 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子句中执行),则会重新抛出捕获的异常对象而不进行更改。