在C#中捕获多个异常

时间:2011-05-25 14:52:18

标签: c#

我正在运行FXCop来清理我的代码,FXCop抱怨我如何捕获异常。 “你不应该捕获Exception或SystemException。捕获通用异常类型可以隐藏库用户的运行时问题,并且可以使调试复杂化。你应该只捕获那些你可以优雅处理的异常。”

以下是我的代码示例,是否有人知道如何改进,(以便FxCop不会抱怨?)

谢谢:)

catch(Exception e)
{
    if(e is IOException)
    {
        Console.WriteLine("{0} System IO Exception", e);
    }

    if (e is DirectoryNotFoundException)
    {
        Console.WriteLine("{0} Directory not found", e);
    }

    if (e is ArgumentException)
    {
        Console.WriteLine("{0} Directory is invalid", e);
    }

    if(e is PathTooLongException)
    {
        Console.WriteLine("{0} Directory path is too long", e);
    }

    if (e is UnauthorizedAccessException)
    {
        Console.WriteLine("{0} Unauthorised to delete directory", e);
    }
}

8 个答案:

答案 0 :(得分:6)

每种类型多次捕获一个。

} catch(DirectoryNotFoundException ex){
    Console.WriteLine("{0} Directory not found", ex);
 } catch(PathTooLongException exx){
    Console.WriteLine("{0} Directory path is too long", exx);
} catch(IOException e){
    Console.WriteLine("{0} System IO Exception", e);
} catch(ArgumentException e){
    Console.WriteLine("{0} Directory is invalid", e);
 } catch(UnauthorizedAccessException exxx){
    Console.WriteLine("{0} Unauthorised to delete directory", exxx);
 } catch(Exception exxxx){
    Console.WriteLine("{0} plain old exception", exxxx);
 }

关于订单的说明

请记住,您希望在列表的前面放置子异常类(在继承方面)。

示例:您ChildException继承自ParentException。在catch块中,您要在ChildException之前列出ParentException。如果首先列出ParentException,那么抛出的任何ChildException将被捕获到可以向上转换的第一个分支中。

修改

  • 固定顺序以考虑继承

答案 1 :(得分:4)

您可以捕获特定的异常并拥有多个catch块,您不需要执行if语句。

我猜它不喜欢你只是抓住Exception而不是特定的例外。

catch(IOException e)
{
  Console.WriteLine("{0} System IO Exception", e);
}
catch(ArgumentException e)
{
  Console.WriteLine("{0} Directory is invalid", e);
}

注意:在IOException之后,您无法捕获DirectoryNotFoundException,因为IOException已经捕获了它。

答案 2 :(得分:2)

首先,我会使用if...else if...else而不是if s。

其次,catch块可以按原样执行此操作。

try {
  ...
} catch (DirectoryNotFoundException dnfex) { // class DirectoryNotFoundException : IOException
  Console.WriteLine("{0} Directory Not Found", dnfex);
} catch (IOException ioex) { // class IOException : SystemException
  Console.WriteLine("{0} System IO Exception", ioex);
} catch (SystemException sex) { // class SystemException : Exception
  Console.WriteLine("{0} System Exception", sex);
} catch (Exception ex) {
  Console.WriteLine("{0} Generic Exception", ex);
}

try...catch...finally语法允许捕获多个/不同的异常,只记住它不像case语句。也就是说,一旦它确定了其中一个异常块,它将继续在[no fall-through mechanism]之下继续更广泛的异常(如果存在)。

编辑更新了我的示例,以说明 应该如何工作。您希望首先从最高级别开始,然后沿着继承树工作。基本上,不要先以IOException开始,然后DirectoryNotFoundException,因为DirectoryNotFoundException IOException

答案 3 :(得分:1)

catch (IOException e) {
}
catch (DirectoryNotFoundException e) {
}
catch (ArgumentException e) {
}

依旧......

或者,如果你所做的只是打印一条消息,你可以用一个catch子句来做:

catch (Exception e) {
    Console.WriteLine(e.Message);
}

答案 4 :(得分:1)

代替来自FxCop的更多信息,处理多种类型的异常的方式有点不合标准。

C#已经提供了一种以不同方式处理不同异常的机制 - 也许这将满足你的FxCop主人:

catch(IOException e)
{
     Console.WriteLine("{0} System IO Exception", e);
}
catch(ArgumentException e)
{
    Console.WriteLine("{0} Directory is invalid", e);
}
//.. etc

答案 5 :(得分:1)

您可以像这样捕获每个异常:

catch(IOException e)
{
    Console.WriteLine("{0} System IO Exception", e);
}
catch(DirectoryNotFoundException e)
{
    Console.WriteLine("{0} Directory not found", e);
}
etc...

将绕过它。这也会让一个未被捕获的异常冒出来。正如您所拥有的那样,除非它们在您的列表中,否则将捕获并忽略所有异常。

答案 6 :(得分:1)

执行:

catch(IOExceptione e){
                 Console.WriteLine("{0} System IO Exception", e);
            }
catch(DirectoryNotFoundException e){
             Console.WriteLine("{0} Directory not found", e);
catch(ArgumentException e){   
                Console.WriteLine("{0} Directory is invalid", e);
            }
          ...

只有当你仍然担心自己没有遇到异常时,才能做到

catch(Exception e){   
                Console.WriteLine("{0} Directory is invalid", e);
            }

在所有其他捕获之后。

答案 7 :(得分:1)

捕获异常的理想方法是,如果可以使用catch的枚举,则不应检查catch中的条件

catch(IOException ioex)
{
   Console.WriteLine("{0} System IO Exception", e);
}

catch (DirectoryNotFoundException dx)
{
      Console.WriteLine("{0} Directory not found", e);
}