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

时间:2009-11-26 09:34:58

标签: c# exception-handling

我创建了自定义异常类

public class Web2PDFException : Exception
{
    public Web2PDFException(string message,
       Exception innerException)
        : base(message, innerException)
    {
    }
}

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

try
{
}
catch (Exception err)
{
//Find exception type here
}

7 个答案:

答案 0 :(得分:57)

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

try
{
   <code>

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

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

答案 1 :(得分:40)

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

try
{
}
catch ( Web2PDFException ex ) when ( ex.Code == 52 )
{
}

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

try
{
}
catch ( Web2PDFException ex )
{
}

try
{
}
catch ( Web2PDFException ex )
{
}
catch ( Exception ex )
{
}

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

 if( err is Web2PDFException)
 {
 }

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

 if( err.GetType().IsAssignableFrom(typeof(Web2PDFException)))
 {
 }

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

答案 2 :(得分:16)

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

答案 3 :(得分:15)

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

调试时可以调用方法,使用调试器的Immediate Window查询变量。请参阅VS文档:Immediate Window

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

enter image description here

答案 4 :(得分:8)

try
{
}
catch (Exception err)
{
    if (err is Web2PDFException)
        DoWhatever();
}

但是可能有更好的方式做任何你想做的事。

答案 5 :(得分:2)

您应该始终尽可能具体地捕获异常,因此您应该使用

try
{
    //code
}
catch (Web2PDFException ex)
{
    //Handle the exception here
}

如果你坚持的话,你当然可以使用这样的东西:

try
{
}
catch (Exception err)
{
    if (err is Web2PDFException)
    {
        //Code
    }
}

答案 6 :(得分:2)

您可以在班级中为您的例外添加一些额外信息,然后当您发现异常时,您可以控制自定义信息以识别您的例外

this.Data["mykey"]="keyvalue"; //you can add any type of data if you want 

然后你可以获得你的价值

string mystr = (string) err.Data["mykey"];

就像这样了解更多信息: http://msdn.microsoft.com/en-us/library/system.exception.data.aspx