什么?39s优先异常还是显式错误测试?

这个问答是每周发布的一系列帖子的一部分,这些帖子强调了技术爱好者遇到的常见问题,并由80多个问答站点组成的免费社区网络Stack Exchange的用户回答。理查德·凯勒问道:

我经常会在激烈的博客文章中看到作者用这样的论点: 异常vs显式错误检查来宣传他/她的首选语言而不是其他语言。普遍的共识似乎是,使用异常的语言天生比严重依赖通过显式函数调用进行错误检查的语言更好/更干净。

使用异常是否被认为比显式错误检查更好的编程实践,如果是,为什么?

注意:特色问题现在在堆栈交换上关闭。请考虑在类似的问题上留下答案: 防御性编程与异常处理?

回答:写清楚安全,但有例外( 49票)。史蒂文·施兰斯克回答说:

在我看来,最大的争论是程序员出错时会发生什么变化。忘记处理错误是一个非常常见且容易犯的错误。

如果返回错误代码,则可能会无声地忽略错误。例如,如果malloc失败,它返回NULL并设置全局errno。所以正确的代码应该做

void * myptr = malloc ( 1024 );如果( myptr = = NULL ) { perror ( malloc );出口( 1 );用( myptr )做一些事情;但是,只写:

void * myptr = malloc ( 1024 )是非常容易和方便的;做某事(我的);这将意外地将NULL传递到您的其他过程中,并可能丢弃精心设置的errno。代码没有明显的错误,表明这是可能的。

在使用异常的语言中,您将编写

mycolobject obj =新mycolobject ( );做某事( obj );在这个( Java )示例中,新运算符要么返回有效的初始化对象,要么抛出memoryerror。如果程序员必须处理这个,他们可以抓住它。在通常(也很方便,也是懒惰)的情况下,异常传播以相对干净和明确的方式终止程序。

这就是为什么异常在正确使用时可以使编写清晰安全的代码变得容易得多的原因之一。这种模式适用于许多可能出错的事情,而不仅仅是分配内存。

回答:除了例外,重构并避免锅炉板( 43票)西蒙回答:

虽然史蒂文的回答提供了很好的解释,但还有一点我觉得相当重要。有时当你检查错误代码时,你不能立即处理失败的情况。您必须通过调用堆栈显式传播错误。当您重构一个大函数时,您可能需要将所有的错误检查锅炉板代码添加到子函数中。

除了例外,你只需要处理你的主流。如果一段代码抛出一些InvalidOperationError,您仍然可以将该代码移动到一个子函数中,错误管理逻辑将被维护。

因此,异常允许您更快地重构,避免锅炉板。

相关: 执行错误处理的现代方式...

回答:错误处理是安全问题( 6票)安全回答:

从另一个角度来看:错误处理是安全问题。未经检查的错误会破坏以下代码所基于的所有假设和先决条件。这可能会打开许多外部攻击媒介:从未经授权的数据访问的简单DoS到数据损坏和完整的系统渗透。

当然,这取决于具体的应用,但是当假设和先决条件被打破时,所有的赌注都被取消了。在一个复杂的软件中,你不能再确定地说从那时起什么是可能的,什么是可以和不能从外部使用的。

考虑到这一点,有一个基本的观察:当安全性被视为可在以后附加的可选附加组件时,它最常失败。当它已经在最初的基本设计阶段被考虑并且从一开始就内置时,它工作得最好。

除了例外,这基本上就是你得到的:一个已经内置的错误处理基础架构,即使你不在乎它也是活动的。通过显式测试,您必须自己构建它。作为第一步,你必须建造它。只是开始编写返回错误代码的函数,而不考虑大局,直到应用程序开发的最后阶段,实际上是一种附加错误处理,注定要失败。

内置系统没有任何帮助。大多数程序员不知道如何处理错误。大部分时间都太复杂了。

可能会发生这么多错误,每个错误都需要自己处理自己的行动和反应。即使是相同的错误也可能需要基于上下文的不同操作。找不到文件或内存不足怎么办?FNF -应用程序运行所需的第三方库?终止。FNF -应用程序的启动配置文件?从默认设置开始。FNF -用户希望应用程序打开的网络共享上的数据文件?消失的文件可以随时发生,甚至在Exists ( )和Open ( )之间的微秒内。这个词的字面意思甚至不是例外。OOM - 2GB的分配?不奇怪。OOM - 100字节分配?你麻烦大了。处理所有小心分离的抽象层的泄漏时出错。最低级别的错误可能需要用GUI消息通知用户。这可能需要用户决定现在做什么。它可能需要日志记录。它可能需要另一部分的恢复操作,例如开放数据库或网络连接。等等。州呢?当您在调用状态更改的对象上调用方法时,它抛出一个错误:该对象是否处于不一致的状态并需要重建?对象状态是否一致,但(部分)已更改,需要额外回滚或重建?是否在对象内进行回滚,并且对调用方保持不变?在哪里做什么更明智?请给我看一本学习者的书,书中错误处理从一开始就经过严格设计,然后贯穿所有的例子,不要为了简洁和可读性而被遗漏,也不要被当作读者的练习。如果从教育的角度来说,这是另一个问题,但不足为奇的是,错误处理在应该是第一次的时候,往往是第二次或第三次考虑就足够了。

想知道为什么异常比错误测试更可取吗?不同意上面的意见吗?将您的专业知识带到Stack Exchange,这是一个由80多个站点组成的网络,您可以在其中交换web应用程序、自行车、专利等主题的专业知识,以及(几乎)中间的所有内容。

Copyright © 2017 时时彩四星缩水软件 版权所有

导航

关闭

欢迎访问