识别处理程序中的异常类型

Tom*_*mas 35 c# exception-handling

我已经创建了自定义异常类

public class Web2PDFException : Exception
{
    public Web2PDFException(string message,
       Exception innerException)
        : base(message, innerException)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我想找出抛出异常是我的自定义异常与否.

try
{
}
catch (Exception err)
{
//Find exception type here
}
Run Code Online (Sandbox Code Playgroud)

Osk*_*uro 60

在处理我不确切知道方法可能出现什么类型的异常的情况时,我喜欢做的一点"技巧"是恢复Exception的类名并将其添加到错误日志中以便有更多信息.

try
{
   <code>

} catch ( Exception caughtEx )
{
   throw new Exception("Unknown Exception Thrown: "
                       + "\n  Type:    " + caughtEx.GetType().Name
                       + "\n  Message: " + caughtEx.Message);
}
Run Code Online (Sandbox Code Playgroud)

我保证总是单独处理异常类型,但额外的信息可能会有所帮助,特别是在处理喜欢捕获全部通用类型的人的代码时.

  • 我在这里很困惑(尤其是赞成票).您是否正在使用堆栈跟踪替换有用的异常,而另一个只有高亮显示?即使您将异常引用为`caughtEx`作为一个孩子,我也不知道重点是什么(如果你显示完整的`exception.ToString()`它会显示你的类型).我可以理解你是否在进行`throw;之前记录它;`... (8认同)
  • 在我的情况下,我需要这个用于记录目的,所以`caughtEx.GetType().Name`正是我想要的.谢谢! (4认同)
  • 嗯,每个人都有自己的 - 对我来说,回到它被抛出的地方的堆栈跟踪并不是我愿意像你的例子那样放弃的东西。正如我所说,我要么想记录它,要么将它作为我的新包装的“InnerException”传递。 (3认同)

Rub*_*ink 45

更新:假设C#6,您的情况可能表示为异常过滤器.从性能角度来看,这是理想的方法,假设您的需求可以用它来表达,例如:

try
{
}
catch ( Web2PDFException ex ) when ( ex.Code == 52 )
{
}
Run Code Online (Sandbox Code Playgroud)

假设C#<6,最有效的方法是捕获特定Exception类型并根据它进行处理.任何包罗万象的处理都可以单独完成

try
{
}
catch ( Web2PDFException ex )
{
}
Run Code Online (Sandbox Code Playgroud)

要么

try
{
}
catch ( Web2PDFException ex )
{
}
catch ( Exception ex )
{
}
Run Code Online (Sandbox Code Playgroud)

或者(如果你需要写一个通用的处理程序 - 这通常是一个坏主意,但如果你确定它最适合你,你肯定):

 if( err is Web2PDFException)
 {
 }
Run Code Online (Sandbox Code Playgroud)

或者(在某些情况下,如果你需要做一些不能表达的更复杂的类型层次结构的东西is)

 if( err.GetType().IsAssignableFrom(typeof(Web2PDFException)))
 {
 }
Run Code Online (Sandbox Code Playgroud)

或切换到VB.NET或F#并使用isType.IsAssignableFrom在异常过滤器中


Ωme*_*Man 17

而是停止调试会话以添加一些调试语句,然后重新编译并重新启动,为什么不立即使用调试器通过调用GetType断点所在的位置来回答该问题?

调试时可以调用方法,使用Immediate Window调试器查询变量.请参阅VS Docs:立即窗口


例如,我需要知道异常是什么,并且只需要提取Name属性,GetType而无需重新编译:

在此输入图像描述

  • 这是正确的答案 (3认同)

bat*_*wad 16

try
{
    // Some code
}
catch (Web2PDFException ex)
{
    // It's your special exception
}
catch (Exception ex)
{
    // Any other exception here
}
Run Code Online (Sandbox Code Playgroud)


eri*_*len 9

try
{
}
catch (Exception err)
{
    if (err is Web2PDFException)
        DoWhatever();
}
Run Code Online (Sandbox Code Playgroud)

但是可能有更好的方法来做任何你想要的事情.