我创建了自定义异常类
public class Web2PDFException : Exception
{
public Web2PDFException(string message,
Exception innerException)
: base(message, innerException)
{
}
}
在我的应用程序中,我想找出抛出异常是否是我的自定义异常。
try
{
}
catch (Exception err)
{
//Find exception type here
}
答案 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#并在异常过滤器中使用 is
或Type.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
属性,而无需重新编译:
答案 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