- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
.NET开发中的异常处理
异常引发准则:
不要返回错误代码。异常是报告框架中的错误的主要手段。
通过引发异常来报告执行故障。如果某一成员无法按预期方式成功执行,则应将这种情况视为一个执行故障并引发一个异常。
如果代码遇到继续执行则不安全的情况,应考虑通过调用 System.Environment.FailFast(System.String)(.NET Framework 2.0 中的一种功能)来终止进程,而不是引发异常。
尽可能不对正常控制流使用异常。除了系统故障及可能导致争用状态的操作之外,框架设计人员还应设计一些 API 以便用户可以编写不引发异常的代码。例如,可以提供一种在调用成员之前检查前提条件的方法,以便用户可以编写不引发异常的代码。
考虑引发异常的性能影响。
记录公共可调用的成员因成员协定冲突(而不是系统故障)而引发的所有异常,并将这些异常视为协定的一部分。包含在协定中的异常不应从一个版本更改到下一个版本。
不要包含可以根据某一选项引发或不引发异常的公共成员。
例如,不要定义如下所示的成员:
Uri ParseUri(string uriValue, bool throwOnError)
不要包含将异常作为返回值或输出参数返回的公共成员。
考虑使用异常生成器方法。从不同的位置引发同一异常会经常发生。为了避免代码膨胀,请使用帮助器方法创建异常并初始化其属性。
不要从异常筛选器块中引发异常。当异常筛选器引发异常时,公共语言运行库 (CLR) 将捕获该异常,然后该筛选器返回 false。此行为与筛选器显式执行和返回 false 的行为无法区分,因此很难调试。
避免从 finally 块中显式引发异常。可以接受因调用引发异常的方法而隐式引发的异常。
异常处理准则:
不要在框架代码中捕捉非特定异常(如 System.Exception、System.SystemException 等)以至忽略错误。
下面的代码示例演示的异常处理是不正确的。
public class BadExceptionHandlingExample1
{
public void DoWork()
{
// Do some work that might throw exceptions.
}
public void MethodWithBadHandler()
{
try
{
DoWork();
}
catch (Exception e)
{
// Swallow the exception and continue
// executing.
}
}
}
避免在应用程序代码中捕捉非特定异常(如 System.Exception、System.SystemException 等)以至忽略错误。某些情况下,可以在应用程序中忽略错误,但这种情况极少。
如果捕捉异常是为了传输异常,则不要排除任何特殊异常。
下面的代码示例演示对以再次引发为目的特殊异常进行的不正确测试。
public class BadExceptionHandlingExample2
{
public void DoWork()
{
// Do some work that might throw exceptions.
}
public void MethodWithBadHandler()
{
try
{
DoWork();
}
catch (Exception e)
{
if (e is StackOverflowException ||
e is OutOfMemoryException)
throw;
// Handle exception and continue
// executing.
}
}
}
如果了解特定异常在给定上下文中引发的条件,请考虑捕捉这些异常。
不要过多使用 catch。通常应允许异常在调用堆栈中往上传播。
使用 try-finally 并避免将 try-catch 用于清理代码。在书写规范的异常代码中,try-finally 比 try-catch 使用得更多。
捕捉并再次引发异常时,首选使用空引发。这是保留异常调用堆栈的最佳方式。
下面的代码示例演示一个可引发异常的方法。
public void DoWork(Object anObject)
{
// Do some work that might throw exceptions.
if (anObject == null)
{
throw new ArgumentNullException(anObject,
Specify a non-null argument.);
}
// Do work with o.
}
下面的代码示例演示捕捉一个异常,并在再次引发该异常时对它进行错误的指定。这
原创力文档


文档评论(0)