Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >对何时抛出异常感到困惑

对何时抛出异常感到困惑
EN

Stack Overflow用户
提问于 2009-09-18 21:41:51
回答 9查看 560关注 0票数 7

我正在开发一个库,用于与外部设备进行通信(通过RS232串行通信)。我在考虑错误处理策略和异常似乎是正确的,行业标准的报告错误的方式。

所以我看了很少关于例外的指南。非常清楚地指出,我应该而不是担心性能的影响:

不要使用错误代码,因为担心异常可能会对性能产生负面影响。

其他告诉我不要在正常情况下抛出异常:

对于正常或预期的错误,或正常的控制流,不要使用异常。

我无法在正常/预期情况与其他情况之间划清界限。例如,在我的库中,操作可能会失败,因为:

  1. 设备没有响应。(没有电缆连接,设备没有打开,波特率错误)
  2. 设备拒绝操作请求,因为它无法验证请求。
  3. 中间的沟通失败了。(有人被电缆绊倒了,设备突然关机)。

我可以按照预期来思考所有这些问题,因为这些问题在实践中经常发生(事实上,许多营销白痴打电话给我来解决软件中的^问题,结果发现他们没有把电缆连接到他们的笔记本电脑上)。因此,可能不应该抛出异常,因为否则应用程序程序员将不得不在很多地方捕获这些代码(我相信,有很多catch块也不太好)。

另一方面,我也倾向于认为这些都是我需要向应用程序程序员报告的错误,而异常似乎就是实现这些错误的方法。如果我不使用异常,我需要使用一些错误代码或错误枚举来报告这些问题。(丑陋,我知道)。

你觉得我该走哪条路?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-09-18 21:50:01

您正在开发一个库,该组件将被其他应用程序使用。

因此,在您提到的预期情况中,我肯定会使用异常与调用应用程序通信,说明出了问题。您应该为这些场景中的每一种情况定义一个自定义异常,然后清楚地记录它们可能发生的时间。

这样,应用程序客户端代码就可以决定如何进行最佳操作。只有客户端应用程序才能做出这一决定,并且明确记录的异常对此有很大帮助。

自定义异常的最佳之处在于,您可以提供与问题/异常相关的多个有意义/有用的数据片段。这些数据也很好地封装在一个对象中。将其与错误代码和返回值进行比较。

性能可能是一个问题,但只有当异常抛出在一个紧密的循环或其他高活动的情况下。为了避免这种情况,您还可以应用.NET框架使用的模式,即提供Try.()方法(例如TryParse()),这些方法返回布尔值,指示操作是否成功或失败。

无论哪种方式,我最初都会处理自定义异常,然后进行性能测试,以确定库中是否有某些部分可能需要优化。

票数 5
EN

Stack Overflow用户

发布于 2009-09-18 22:43:33

我将在以下方法中使用例外(受按合同设计的启发)

  • 在可能的情况下,提供布尔检查函数,告诉您是否可以安全地应用某个操作。
  • 对于给定的操作,将这样的检查函数作为先决条件:如果它有效,则操作可以安全地完成,如果不安全,则抛出异常。

通过这种方式,如果API用户可以使用if -然后-else结构对其关键逻辑进行编码.

如果出现意外情况(例如,由于微妙的时间问题)将抛出一个异常:开发人员可以捕获该异常并处理它。但是请注意:这不一定是在调用方法的地方:它可以在调用堆栈中更高/更早,在处理所有奇怪异常的中心位置。

我在数百万行C程序中完成了错误处理代码的自动化分析。这些是基于要求手写检查和传播错误码的编码标准.结果发现,开发人员不喜欢编写这样的代码,他们忘记了,而且很容易出错。事实上,我们发现了每1000行C代码编码标准的两个偏差(可以说是两个错误)。

总之:(1)我使用布尔检查器(2)可以在调用堆栈的较高位置捕获异常;(3)依赖错误代码在实践中是不安全的。

票数 3
EN

Stack Overflow用户

发布于 2010-02-08 03:25:18

例外情况正是针对这种特殊情况而设计的。我试着这样想--如果你假设你所依赖的一切在大多数情况下都是正常的,而方法X失败了,那么这是一个特殊的情况,因为它通常不会发生,你应该定义异常来捕捉这种情况。

因此,在您的情况下,您假设设备已经启动并运行。因此,在这种情况下,异常情况是设备不接受连接、拒绝连接、不接受您发送的数据或不接收它应该发送的数据等等。如果设备每天经常关闭几次,那么您希望它们被关闭,所以在连接之前使用返回代码或"bool IsDeviceOn()“方法来检查它。

如果您的确实期望在正常情况下发生,比如查询设备的功能,但是您想要的设备是不可用的,那么使用返回代码或bool方法--例如"bool DoesDeviceHaveThisCapability();“不要在没有异常的情况下捕获异常。

另一个例子(用于GUI应用程序)是用户输入。不要对此使用异常,因为您确实期望用户输入错误--我们并不完美。

我已经经历了大量的性能问题,因为使用异常时,它们并不是真正的例外情况。一个例子是当我每天处理2GB数据文件2-3次时。有些行的有效价格为0.00格式。有些人没有。我用FormatException来捕捉那些没有的。

两年后,当我有机会得到一个性能分析器的时候,发现异常的那句话占了分析文件所用时间的80%。我将其改为使用int的TryParse()方法,并获得了巨大的速度增长。

对于您的例子,我可能会使用:

  1. 没有来自设备的响应-如果设备应该是24/7,则返回代码,如果正常关闭
  2. 未经授权的行动-例外
  3. 通讯失败-异常
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1447879

复制
相关文章
java 对于表情和特殊字符的转码解码处理
转码然后插入到DB当中 String encodestr=URLEncoder.encode("需要转码的内容", "utf-8") 将encodestr插入数据库中 解码然后显示到页面当中 String decodestr=URLDecoder.decode("需要解码的内容", "utf-8") 在页面展示decodestr
用户4191150
2021/08/12
3.8K1
MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义
在 MSBuild 中有一些特殊字符,如 $ @ % ' 等,本文介绍他们的含义,如何使用他们,以及你真的需要这些字符的时候如何编写他们。
walterlv
2023/10/22
4280
Shell特殊字符
shell既是类Unix操作系统的命令解析器,用于解释执行用户输入的一连串命令,它类似于DOS下的command和后来Windows的cmd.exe。同时shell也是一种程序设计语言。作为命令解释型的脚本语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它预定义了各种环境变量,保留了一些关键字以及一些特殊字符的含义,并提供了许多在高级语言中才具有的控制结构,包括循环和分支判断。
恋喵大鲤鱼
2018/08/03
5.2K0
HTML特殊字符
HTML 原始码 显示结果 描述 &lt; < 小於号或显示标记 &gt; > 大於号或显示标记 &amp; & 可用於显示其它特殊字符 &quot; " 引号 &reg; ® 己注册 &copy; © 版权 &trade; ™ 商标 &ensp; 半方大的空白 &emsp; 全方大的空白 &nbsp; 不断行的空白
小小许
2018/09/20
3.7K0
MySQL 特殊字符
SQL 注释是用来在 SQL 语句中添加对代码的解释说明。SQL 支持两种类型的注释符号。
恋喵大鲤鱼
2023/10/12
9820
特殊的 x 命名空间
为什么叫它特殊呢,因为x命名空间中的东西是用来服务整个xaml页面的,通过这个命名空间中的工具,可以去扩充xaml的功能,或者帮助我们更好的开发xaml页面。
宿春磊Charles
2021/11/05
5970
Jdom生成xml文件时的特殊字符问题(冒号,注释等)
public static String toXML(String path) throws IOException { Element root = new Element("ADI"); // 将根节点添加到文档中; Document Doc = new Document(root); CDATA text = null; // 创建节点 Element elements = new Elem
JQ实验室
2022/02/10
7670
Python一行代码过滤标点符号等特殊字符
很多时候我们需要过滤掉标点符号等特殊字符,网上虽然有一堆的方法,但是都没有找到一个非常满意的,有些过滤不了中文的标点符号,有些过滤不了英文的标点符号,有些过滤不全。
AntDream
2019/08/13
4.1K0
特殊字符乱码问题
1、使用标签 建议用(标签可以控制转换特殊字符): <html:text property=“instruction” readonly=“true” styleClass=“mylongreadonly” size=“32”/> <input name=“instruction” type=“hidden” value=”<mycim2:write name=“object” property=“instruction” filter=“true”/>” > <input name=“instruction” type=“hidden” value=”<bean:write name=“object” property=“instruction” filter=“true”/>” >
全栈程序员站长
2022/06/27
2.7K0
iOS去除特殊字符
// 清除特殊字符 + (NSString *)cleanSpecialCharacters:(NSString *)text { NSString *strResult = nil; NSMutableString *originString = [text mutableCopy]; NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@"~!@#$%^&*()+={}':;',[]\\.
Raindew
2019/05/17
3.3K0
转义JavaScript特殊字符
大家可以举一反三,触类旁通,反正,双引号和单引号可以配合着使用,把我上面的案例看懂,你就能灵活的运用了。
IT工作者
2022/01/05
4.1K0
字符串解码
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你的益达
2020/08/05
5980
空间索引-geohash编码解码类
算法实现原理请看:http://www.php20.cn/article/125
仙士可
2019/12/19
1K0
空间索引-geohash编码解码类
Shell常用的特殊字符
点号在不同场景有着不同的含义,在目录路径中,一个点代表当前工作目录,两个点代表父目录;当一个文件以点号开头,表示一个隐藏文件;在正则表达式,点号代表匹配单个字符;
用户1679793
2020/10/29
8.1K0
BashShell常量和特殊字符
其中,base 是一个 2 到 64 的十进制数值,表示数字的基数;n 是在 base 基数中的数字的值。如果忽略 base# ,则默认以 10 为基数。n 中的每一位数如果大于 9,则依次以小写字母、大写字母、@、_ 表示(最大表示到十进制中的 63,因为 base 最大为 64)。
hotarugali
2022/02/28
5.6K0
jquery特殊字符问题处理
问题:今天项目上有个地方使用 $(“#lamp”).load(‘/admin/checklogin.php?sid=’+sid); 这样传递的时候遇到空格就直接参数就丢失 后经查询资料发现可以使
苦咖啡
2018/05/07
2.9K0
Java 字符编码与解码
IT可乐
2018/01/04
2.3K0
LogQL如何转义特殊字符
在上篇的Loki操作方法系列中,我已经分享了创建快速过滤器查询的所有最佳技巧,这些查询可以在几秒钟内过滤掉TB级的数据。
云原生小白
2021/05/13
2.9K0
点击加载更多

相似问题

解码特殊字符

25

解码特殊字符“?”

11

通用URL解码函数应该处理"+“字符还是只处理"%20”等字符?

12

HTML特殊字符解码

20

邮编-解码特殊字符

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文