Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果MSDN中没有记录,如何确定某个方法可以抛出哪些异常?_C#_.net_Exception_Exception Handling_Msdn - Fatal编程技术网

C# 如果MSDN中没有记录,如何确定某个方法可以抛出哪些异常?

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文

最近我得到了一个异常,这是我没有预料到的,因为MSDN中没有记录它可以由特定的构造函数抛出。下面是引发异常的C#行:

    using (StreamReader sr = new StreamReader(filePath))
filePath这里是应该包含某个文件的完整路径的字符串。问题是我的“filePath”变量实际上是文件夹的路径,而不是文件的路径。因此,构造函数StreamReader(文件路径)抛出:

这显然是一个bug,我通过传递一个正确的路径来修复它。。。但是查看MSDN文档,我看不到任何关于此异常的提及。在例外条款下,有:

  • ArgumentException-路径为空字符串(“”)
  • ArgumentNullException-路径为空
  • FileNotFoundException-找不到该文件
  • DirectoryNotFoundException-指定的路径无效,例如位于未映射的驱动器上
  • IOException-路径包含错误或无效的文件名、目录语法 名称或卷标
再考虑一下这个问题,我想抛出的异常实际上应该是IOException,而不是UnauthorizedAccessException。这是.NET Framework中的错误吗?问题是,我有IOException处理程序,它通知用户无效的文件路径,并在不崩溃的情况下继续应用程序工作流。此UnauthorizedAccessException使我的应用程序崩溃,因为它未经处理


我应该如何处理这类问题?我想我在过去遇到过类似的未记录异常问题,但这一问题确实促使我研究这个问题,并在这里提出问题。

不幸的是,确实没有办法以一般方式处理这个问题。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;
     }
}