异常类型

异常一般分为系统异常 和 应用异常。系统异常有无法连接数据库,而应用异常是业务逻辑异常,比如授权失败。

在 C# 中异常基于 System.Exception,派生出 System.SystemException 和 System.ApplicationException。微软最初设计为 CLR 抛出的异常都继承自 System.SystemException,应用程序抛出的异常应当继承自 System.ApplicationException。但 .NET 框架类库(FCL) 没能很好地遵循这个原则。因此,目前存在的 System.SystemException 和 System.ApplicationException 主要用于兼容。

  1. 在实际业务中,不应该使用 System.SystemException 和 System.ApplicationException
  2. 不要在非顶层中捕获 System.Exception,除非你会在捕获后重新抛出
  3. 在对象不正确的时候,可使用 System.InvalidOperationException 和 System.ArgumentException 和其派生异常。例如给只读对象赋值
  4. 业务异常应该定义一个基于 System.Exception 的自定义异常,并基于自定义的异常再派生具体的异常。例如业务异常为 BusinessException:System.Exception,转账业务异常为 TransferFundsException:BusinessException
  5. 需要给异常填写异常描述
  6. 不要自己抛出 System.StackOverflowException 这类异常
  7. 并不是所有情况都需要使用 try catch 语句,可使用 if 提前判断是否抛出异常,以提高性能

使用 throw 和 throw ex 的区别

在 C# 中推荐使用 throw,原因是如果直接使用 throw ex 会清除原始的异常,将 ex 作为新的异常源,从而找不到真正的异常源。

建议只在最外层做捕获。

// 错误的用法
try
{
}
catch(Exception ex)
{
throw ex;
} // 正确的用法
try
{
}
catch
{
throw;
} // 正确的用法
try
{
}
catch(Exception ex)
{
throw new Exception("message", ex);
} // 正确的用法
throw new AppException("message");

CA1031:不要捕捉一般异常类型

原因

一般异常(如 System.Exception 或 System.SystemException)在 catch 语句中捕获,或者使用 catch() 等常规 catch 子句。

规则说明

不应捕捉一般异常。

如何解决冲突

若要修复与此规则的冲突,请捕获更具体的异常,或者再次引发一般异常作为 catch 块中的最后一条语句。

何时禁止显示警告

不禁止显示此规则发出的警告。 捕获一般异常类型可以隐藏库用户的运行时问题,并且可能会使调试变得更加困难。

示例

下面的示例显示一个与此规则冲突的类型和一个正确实现 catch 块的类型。

using System;
using System.IO; namespace DesignLibrary
{
// Creates two violations of the rule.
public class GenericExceptionsCaught
{
FileStream inStream;
FileStream outStream; public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
catch(SystemException e)
{
Console.WriteLine("Unable to open {0}.", inFile);
} try
{
outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine("Unable to open {0}.", outFile);
}
}
} public class GenericExceptionsCaughtFixed
{
FileStream inStream;
FileStream outStream; public GenericExceptionsCaughtFixed(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
} // Fix the first violation by catching a specific exception.
catch(FileNotFoundException e)
{
Console.WriteLine("Unable to open {0}.", inFile);
} try
{
outStream = File.Open(outFile, FileMode.Open);
} // Fix the second violation by re-throwing the generic
// exception at the end of the catch block.
catch
{
Console.WriteLine("Unable to open {0}.", outFile);
throw; //手动高亮
}
}
}
}

最新文章

  1. oracle存储过程截取字符串
  2. EntityFramework 性能优化
  3. linux驱动之触摸屏驱动程序
  4. Android Studio的一些快捷键
  5. LINQ to Entities 查询语法
  6. java学习之路----内存的分析
  7. linux学习(八)chmod、chown、umask、lsattr、chattr
  8. 一个关于cookie的坑
  9. webpack 与 vue 打包体积优化
  10. 如何分析java内存泄漏问题
  11. 内置函数_range()
  12. TerraGate软件安装后,服务无法启动的解决方法
  13. mem 0908
  14. 单片机CPU
  15. (转)在NGUI使用图片文字(数字、美术字)(直接可用于UILable)
  16. 使用Windbg解析dump文件
  17. BZOJ2694:Lcm——包看得懂/看不懂题解
  18. 关于解决乱码问题的一点探索之一(涉及utf-8和GBK)
  19. cg教程
  20. BTA 常问的 Java基础40道常见面试题及详细答案(山东数漫江湖))

热门文章

  1. 对拍程序 x
  2. 【bzoj3566】 [SHOI2014]概率充电器
  3. 【CF1251E】Voting(贪心)
  4. 三维显示插件——C++
  5. CCPC E Problem Buyer
  6. EventBus和Otto第三方构架
  7. android hidl
  8. springAOP基于注解的使用方法和实现原理
  9. java8 list转Map报错Collectors.toMap :: results in "Non-static method cannot be refernced from static context"
  10. KETTLE——(一)资源库