我正在运行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);
}
}
答案 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);
}