C# 如果MSDN中没有记录,如何确定某个方法可以抛出哪些异常?
最近我得到了一个异常,这是我没有预料到的,因为MSDN中没有记录它可以由特定的构造函数抛出。下面是引发异常的C#行:C# 如果MSDN中没有记录,如何确定某个方法可以抛出哪些异常?,c#,.net,exception,exception-handling,msdn,C#,.net,Exception,Exception Handling,Msdn,最近我得到了一个异常,这是我没有预料到的,因为MSDN中没有记录它可以由特定的构造函数抛出。下面是引发异常的C#行: using (StreamReader sr = new StreamReader(filePath)) filePath这里是应该包含某个文件的完整路径的字符串。问题是我的“filePath”变量实际上是文件夹的路径,而不是文件的路径。因此,构造函数StreamReader(文件路径)抛出: 这显然是一个bug,我通过传递一个正确的路径来修复它。。。但是查看MSDN文
using (StreamReader sr = new StreamReader(filePath))
filePath这里是应该包含某个文件的完整路径的字符串。问题是我的“filePath”变量实际上是文件夹的路径,而不是文件的路径。因此,构造函数StreamReader(文件路径)抛出:
这显然是一个bug,我通过传递一个正确的路径来修复它。。。但是查看MSDN文档,我看不到任何关于此异常的提及。在例外条款下,有:
- ArgumentException-路径为空字符串(“”)李>
- ArgumentNullException-路径为空李>
- FileNotFoundException-找不到该文件李>
- DirectoryNotFoundException-指定的路径无效,例如位于未映射的驱动器上李>
- IOException-路径包含错误或无效的文件名、目录语法 名称或卷标
我应该如何处理这类问题?我想我在过去遇到过类似的未记录异常问题,但这一问题确实促使我研究这个问题,并在这里提出问题。不幸的是,确实没有办法以一般方式处理这个问题。C#和CLR的性质使得很难(如果不是完全不可能的话)确定可以从方法中抛出的全部异常集。有一些简单的API是可能的,但一般来说不是
我处理这个问题的方法是简单地捕获
异常
。CLR的最新版本使得默认情况下无法捕获危险的异常。因此,您只能捕获更安全的异常。除非您想对一个非常特定的错误做出反应,否则只需捕获所有错误并对API调用失败采取适当的操作即可我以前读过这篇文章。。。愿它能给你一些启示。Microsoft Program Manager在一篇文章中写道。我认为无论如何都看不到方法可能引发的所有异常。事实是,您必须递归所有方法调用才能获得该列表,而这是不会发生的
就我个人而言,我对异常处理的感觉更像是JoelSpolsky()的观点;我很少捕捉特定的异常,我尽量避免使用try-catch。在这种情况下,我将使用
catch(Exception e)
来避免这个问题,然后我将使用if-else来尽可能适当地处理不同的类型。虽然您不能事先100%地知道方法可以抛出哪些类型的异常,但是有一些方法可以避免陷入这个问题,这确实是CLR中缺少的东西,您遵循一种常见模式,即捕获从异常
派生的所有异常,然后进一步区分哪些可以处理,哪些不能处理
try
{
}
catch (FileNotFoundException)
{
}
catch (DirectoryNotFoundException)
{
}
catch (IOException)
{
}
catch (Exception exception)
{
// For the ones you do not know how to handle, at least document it and throw
log(exception);
throw;
}
这将使您的调试更加容易
请务必意识到,此模式将基于层次结构,在层次结构中,派生度越高的异常类型应首先执行,否则您将面临先执行派生度越低的catch
的风险。换句话说,不要这样做
try
{
}
catch (IOException)
{
// Will get executed for both DirectoryNotFoundException and
// FileNotFoundException even though you specified specific ways to
// handle these types
}
catch (DirectoryNotFoundException)
{
}
catch (FileNotFoundException)
{
}
或者,您可以只捕获异常
,并使用if
来测试实际类型,虽然没有那么漂亮,但可能更灵活
try
{
}
catch (Exception exception)
{
if (exception.GetType() == typeof(IOException))
{
}
else if (exception.GetType() == typeof(DirectoryNotFoundException))
{
}
else if (exception.GetType() == typeof(FileNotFoundException))
{
}
else
{
log(exception);
throw;
}
}
在各种情况下,microsoft提供了不正确的异常或msdn中未提及的特定方法的异常。我还面临着类似的情况,我必须捕获一般异常而不是特定异常(在我的例子中是system.formatexception) 但是,您可能会遇到一些问题,比如避免静态FxCop冲突。根据fxcop的说法,不应该捕捉到一般的异常 我们找到了获得错误异常类型的原因,是另一个异常中的异常导致了真正的异常被规避 **例外就像是身体疼痛。两者都表明系统中存在问题,但对所有疼痛服用相同的药物并不好,因此尝试捕捉这种情况下的特定异常
try
{
}
catch (Exception exception)
{
if (exception.GetType() == typeof(IOException))
{
}
else if (exception.GetType() == typeof(DirectoryNotFoundException))
{
}
else if (exception.GetType() == typeof(FileNotFoundException))
{
}
else
{
log(exception);
throw;
}
}