如何解决在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);
}
}
解决方法
每种类型有多个捕获点。
} 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块中要在list3ѭ之前列出ChildException
。如果首先列出了“ 3”,那么任何抛出的“ 2”都将被捕获到第一个分支中。
编辑
确定继承的固定顺序
,您可以捕获特定的异常并具有多个catch块,而无需执行if语句。
我猜这不喜欢您只抓到8英镑而不是特定例外的事实。
catch(IOException e)
{
Console.WriteLine(\"{0} System IO Exception\",e);
}
catch(ArgumentException e)
{
Console.WriteLine(\"{0} Directory is invalid\",e);
}
注意:您不能在IOException之后捕获DirectoryNotFoundException,因为IOException已经捕获了它。
,例如,我将使用if...else if...else
而不是连续continuous11s。
其次,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语句。就是说,一旦它限定了一个异常块,就不会继续到[没有掉线机制]下面的更广泛的异常(如果存在)。
EDIT更新了我的示例,以显示其工作方式。您想首先从最高级别的类开始,然后沿继承树逐步发展。基本上,首先不要以ѭ14开头,然后以ѭ15开头,因为ѭ15就是IOException
。
,catch (IOException e) {
}
catch (DirectoryNotFoundException e) {
}
catch (ArgumentException e) {
}
等等...
或者,如果您正在做的只是打印一条消息,则可以使用单个catch子句来做到这一点:
catch (Exception e) {
Console.WriteLine(e.Message);
}
,代替FxCop提供的更多信息,处理多种类型的异常的方法有点不规范。
C#已经提供了一种以不同方式处理不同异常的机制-也许这将使您的FxCop主管满意:
catch(IOException e)
{
Console.WriteLine(\"{0} System IO Exception\",e);
}
catch(ArgumentException e)
{
Console.WriteLine(\"{0} Directory is invalid\",e);
}
//.. etc
,您可以像这样捕获每个异常:
catch(IOException e)
{
Console.WriteLine(\"{0} System IO Exception\",e);
}
catch(DirectoryNotFoundException e)
{
Console.WriteLine(\"{0} Directory not found\",e);
}
etc...
它将绕过它。同样,这也会使未捕获的异常冒出来。现在,所有异常都将被捕获,除非它们在列表中,否则它们将被忽略。
,做:
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);
}
毕竟其他所有。
,捕获异常的理想方法是,如果有可用的捕获枚举,则不应检查捕获中的条件
catch(IOException ioex)
{
Console.WriteLine(\"{0} System IO Exception\",e);
}
catch (DirectoryNotFoundException dx)
{
Console.WriteLine(\"{0} Directory not found\",e);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。