异常处理的最佳习惯

一个被良好设计的错误处理代码块集可以让程序更健壮并且面临更少的崩溃机会,因为这样的应用程序对错误进行了处理。下面的列表包含了异常处理最佳习惯中的建议:

  1. 知道什么时候要设立 try/catch 块。例如,你可以通过编程来检查可能发生在使用异常处理之外的条件。而在其他情况下,就应该适当地使用异常处理来捕获错误条件。

    以下范例使用了一个 if 语句来检查连接是否已经关闭。你可以使用这个方法来代替如果连接没有被关闭就抛出一个异常的做法。

       if(conn.State != ConnectionState.Closed)conn.Close();

    在以下范例中,一个异常被抛出,如果连接没有被关闭的话。

       try {conn.Close();}catch(InvalidOperationException ex) {//以该错误做一些事情或者忽略它。}

    你选择的该方法依赖于你如何经常期望该事件的产生。如果该事件是真实的异常并且是一个错误(比如一个未预料的文件结尾),那么使用异常处理就是更好的,因为只有更少的代码才会在常规场合中被执行。如果该事件经常发生,那最好是使用可编程的方法来检查错误。在这种情况下,如果产生一个异常,该异常就将获得更长的处理时间。

  2. 使用 try/finally 块包围可能潜在被产生的异常并且把你的 catch 语句集中到一个位置的代码。这样,try 语句就会产生异常,而 finally 语句就会关闭或者取消资源的分配,并且 catch 语句还会从一个集中的位置来对异常进行处理。
  3. 始终按照最特殊到最不特殊的顺序来排列 catch 块中的异常。这个技术会在它被传递到一个更普通的 catch 块之前对特殊的异常进行处理。
  4. 以单词[Exception]作为异常类名称的结尾。例如:
    public class MyFileNotFoundException : ApplicationException {
    }
  5. 当创建用户定义的异常时,你必须确保该异常的元数据可用于远程代码执行,包括跨越应用程序域而产生的异常。例如,假设 Application Domain A 创建了执行了抛出异常的代码的 Application Domain B。为了让 Application Domain A 适当地捕获并且处理该异常,它必须可以找到包含了由 Application Domain B 所抛出的异常的汇编集。如果 Application Domain B 在它的应用程序基础之下抛出了一个包含在汇编集中的异常,但不是在 Application Domain A 的应用程序基础之下,那么 Application Domain A 将无法找到该异常并且公共语言运行时还会抛出 FileNotFoundException。要避免出现这种情况,你可以布署以两种方式来包含异常信息的汇编集:
    1. 把汇编集放到一个同时被两个应用程序域所共享的公共应用程序基础中

      - 或者 -

    2. 如果该域没有共享公共应用程序基础,就以强名称来标记该汇编集来包含异常信息并且把该汇编集布署到全局汇编缓存中。
  6. 在 C# 与 C++ 中,在创建你自己的异常类时至少使用三种公共的构造器。关于范例,参考[使用用户定义的异常]。
  7. 在多数情况下,可以使用预定义的异常类型。只在可编程情况下才定义新的异常类型。引入一个新的异常类来允许程序员在基于该异常类的代码中采取其他的动作。
  8. 大部分应用程序都可以从 Exception 类派生出自定义异常。这是自定义异常应该派生自 ApplicationException 类的最初考虑;然而并没有发现这会从习惯上增加重要的价值。
  9. 在每个异常中都包括一个本地化的描述字符串。当用户看到错误消息的时候,这就是从派生自被抛出异常的类的描述字符串,胜于从异常类中。
  10. 使用正确的文法错误消息,包括结尾标点符号。异常描述字符串中的每个句子都应该以一个句号结尾。
  11. 为可编程访问而提供 Exception 属性。只在额外信息是有用的可编程情况下才包括异常的额外信息(除了描述字符串之外)。
  12. 为非常公共的错误情况而返回 null。例如,File.Open 会返回 null,如果该文件没有被找到的话,但是抛出一个异常,如果该文件被发现的话。
  13. 设计从不会在常规使用中抛出异常的类。例如,一个 FileStream 类暴露了检测是否已经到达文件结尾的其他方式。这就避免了抛出异常,如果你读取到到文件结尾之外的话。下列范例说明了如何读取到文件的结尾。
    class FileRead {void Open() {FileStream stream = File.Open("myfile.txt", FileMode.Open);byte b;// ReadByte 在 EOF 返回 -1。while ((b == stream.ReadByte()) != true) {// 做些什么。}}
    }
  14. 抛出一个 InvalidOperationException,如果一个属性集或者方法调用没有适当地提供对象的当前状态的话。
  15. 抛出一个 ArgumentException 或者一个派生自 ArgumentException 的类,如果传递了无效的参数的话。
  16. 堆栈追踪开始于异常被抛出的语句并且结束于捕获该异常的 catch 语句。在你决定在哪里存放一个 throw 语句的时候就应该明白这个事实。
  17. 通常为一个类从它的实现中的不同位置抛出相同异常的公共方式而使用异常建立器方法。为了避免额外的代码,可以使用创建异常并且将其返回的辅助方法。例如:
    class File {string fileName;public byte[] Read(int bytes) {if (!ReadFile(handle, bytes))throw NewFileIOException();}FileException NewFileIOException() {string description = // 建立本地化的字符串,包括 fileName。return new FileException(description);}
    }

    或者使用异常的构造器来建立该异常。这更加适合于全局异常类,比如 ArgumentException。

  18. 抛出异常来代替返回错误代码或者 HRESULT。
  19. 在抛出异常的时候清理中间结果。调用者应该可以假设在异常从方法中被抛出的时候没有负面影响。

转载于:https://www.cnblogs.com/Laeb/archive/2007/03/29/693253.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 299. 猜数字游戏

1. 题目 你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜。 每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛)&#xff0…

手机内部零件名称图解_旧手机回收后都干嘛了?

以下为正文有问题不懂?有事情不知道?疑难问题需要求解?快来汉中艾特闹APP提问贴心小编和60万汉中艾特闹粉丝为你解答‍汉中艾特闹APP【有问必答】栏目已上线新一期网友提问来了↓↓↓网友提问旧手机回收后都干嘛了?对此问题&#…

AI取代人类,可以自动生成prompt了

文 | 智商掉了一地如何才能让大型语言模型按照我们的要求去做?这篇文章给出了回答——近期在 NLP 领域风很大的话题莫过于 Prompt,尤其当大型语言模型(LLM)与其结合,更是拉近了我们与应用领域之间的距离,当…

Atmospheric Scattering

以前由于硬件限制,很多游戏的天空和地面颜色主要是用贴图模拟,近来硬件的发展,越来越多的游戏开始采用基于比较真实的大气散射模型来实时计算。很多文章的计算最终都将眼睛高度和角度作为参数,这里主要按照Sean O’Neil系列的方法…

程序员面试金典 - 面试题 10.11. 峰与谷(排序/不排序)

1. 题目 在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。 例如,在数组{5, 8, 2, 6, 3, 4, 3}中,{8, 6}是峰, {3, 2}是谷。 现在给定一个整数数组&#xf…

计算机视觉自学进阶路上不可忽略的几个原创公众号

人工智能行业目前已接近饱和状态,如何从内卷中脱颖而出,除了极强的自律之外,系统性的学习方法也很重要。今天给大家推荐10个原创公众号,这些公众号定期会发些高质量原创,希望可以让你更高效的学习。深度学习与图网络最…

python列表功能默写_初识 Python 作业及默写

1、简述变量量命名规范 2、name input(“>>>”) name变量是什么数据类型? 3.if条件语句的基本结构? 4.用print打印出下面内容: 文能提笔安天下, 武能上马定乾坤. 心存谋略何人胜, 古今英雄唯是君. 5.利用if语句写出猜⼤小的游戏: 设定一个理想数字比如:66&#xff…

关于淘宝的无耻!

前两天在TAOBAO上以个人名义买了两个CN域名,买了之后才知道个人是无权购买CN域名的,这也就是说个人够买的CN域名是没有任何保障的!在购买前,买家没有给出提醒,很明显,买家存在欺诈行为,所以我向TAOBAO发起投诉.下面是投诉处理结果:据淘宝游戏频道免责声明,如买家通过…

整顿职场,从 ROC 曲线开始

文 | 天于刀刀大家好,我是刀刀。这周有个哥们在组会上被领导刁难了一波,来群里吐槽,最后意外地在大神的指导下又复习了一下 precision recall rate (PRR) 和 ROC 曲线的知识点:后面聊天的画风就彻底转向吐槽…

数据结构--树状数组

文章目录1. 树状数组2. 单点修改3. 区间修改4. 完整代码5. 参考文献1. 树状数组 类似数据结构:线段树(Segment Tree) 树状数组 跟 线段树 的区别: 树状数组能做的事情,线段树都能做!(线段树功…

python异常数据处理_Python爬虫提高之异常处理

Python爬虫框架之异常处理 任何访问服务器获取数据的请求,都需要做异常处理,当然爬虫更需要我们对各种异常进行处理。只有这样才能提高爬虫的健壮性。如果我们的爬虫足够健壮,那么就能确保程序几个月不停止。 我们从以下几个方面做出讲解&…

BERT部署加速622%,YOLOv7部署加速590%,这款开源压缩神器火了!

导读 众所周知,计算机视觉技术(CV)是企业人工智能应用比重最高的领域之一。为降低企业成本,工程师们一直在探索各类模型压缩技术,来产出“更准、更小、更快”的AI模型部署落地。而在自然语言处理领域(NLP&…

程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

文章目录1. 题目2. 解题2.1 map2.2 树状数组1. 题目 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入…

python常用函数的用法_python中常用函数整理

1、map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象。 class map(object):""" map(func, *iterables) --> map objectMake an iterator that computes the…

.NET中得到计算机硬件信息

VB.NET中得到计算机硬件信息 本文汇集了在.net中得到计算机硬件信息的一些功能。 得到显示器分辨率 Dim X As Short System.http://dev.21tx.com/os/windows/" target"_blank">Windows.Forms.Screen.PrimaryScreen.Bounds.Width Dim Y As Short System.…

diffusion新高度!可一次性生成200张图??

文 | Pine 明敏(凹非寺)源 | 量子位给AI一个提示词,一次性出200张图!生成速度嗖嗖的,不到3分钟全搞定。喜欢哪张任君挑选,还能直接二次调整编辑。咱就是说,这回用AI画画,终于不废人了…

转正

三个月的时间悄悄的溜走这也是我走出学校之前与社会的一段磨合期感觉自己是幸运的因为在我身边总是可以遇到很多很好的朋友一起陪伴着走过风风雨雨或许生活是残酷的或许我们总是会遇到这样那样不如意的事情但是只要我们勇敢的去面对雨后的天空总会有绚丽的彩虹不要埋怨命运因为…

程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。 注意,不是必须有这些素因子,而是必须不包含其他的素因子。 例如,前几个数按顺序应该是 1,3,5,7&…

python怎么封装供java调用_python调用第三方java包实例

先看结果:对于python与java的互调,我一开始是用的py4j,但是后来发现在使用方法的时候,不知道如何在python中导入jar包,然后网上的资料也比较少。后来想不出来办法,又看到有Jpype这个东东。博友们说Jpype的安装比较不好…

推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上

文 | 天于刀刀他来了他来了!他带着他的裁员方案走来了!带着他的水槽 sink in 的第一天,全球打工人的目光不由自主地聚焦于这个神奇的男人身上:paypal 帮派元老,特斯拉 starlink 创始人,埃隆火星人马斯克&am…