基本上是否存在例外来防止系统崩溃?


16

第二,我想知道是否有人知道异常(在异常控制流领域)和异常(例如在Java中使用)之间的区别。

但是它们是否可以通过终止用户程序来从根本上防止系统崩溃?

Answers:


29

存在允许异常处理的异常,该异常处理可以避免崩溃,但更一般而言,可以防止意外或不可预测的系统行为。例如,如果我的程序与数据库的连接超时,通常不会使系统崩溃,但是如果我依赖于数据库中的数据,则异常可以使我以不同于常规的方式对待这种无数据的情况。

假设默认情况下,我的程序基于数据库返回的内容显示数据页面-废话,我没有数据。无需呈现混乱的视图或继续进行可能无效的操作,我可以捕捉到该异常并回到另一个数据库,从本地数据中读取,询问用户数据或以其他方式使用户或系统返回安全状态(大概是一个状态)。那不会立即导致相同的异常!)

另外,在用户输入可能是问题原因/解决方案的系统中,异常可以使用户知道有关问题的详细且有用的信息。您可以告诉用户一些有用或至少可以理解的内容,例如“无法连接到资源B”,而不是太常见的“在...处发生未处理的异常”或“直接从SQL发出令人生畏的错误消息”。


5
我觉得这是最准确的答案。程序是有效的有限状态机。有几种方法可以通过引入不良数据来破坏机器,这将导致机器故障。抛出异常以防止这种情况。有时机器可以自我恢复,但有时无法恢复。
安迪

1
我无法对错误代码执行完全相同的操作吗?您返回一个错误,我来处理。
mskw

16

创建了异常以简化错误处理。没有例外,错误处理逻辑必须遍布整个应用程序。任何可能导致错误的函数都必须以某种方式返回错误状态,并且每次调用后都必须检查错误。通常,在发生错误的情况下,调用方不会做任何有用的事情,并且只能返回错误本身。应用程序代码的一半可能专用于错误处理。这样的代码非常脆弱。忽略错误检查并崩溃很容易,或者更糟糕的是,由于未注意到的错误而返回错误的结果。

除例外,错误只能在可以处理的地方进行检查。大多数应用程序代码都可以以直线方式编写,因为函数将返回可用值或引发异常。


5

例外的重点应该是告知用户特殊情况。如果系统出了问题,程序应该知道并被允许*适当地处理它。

就是说,不,不存在防止系统“崩溃”的异常。一个例外是让我知道有问题。我如何确定可以确定系统是否“崩溃”。

还请注意,异常不必像您所说的那样终止应用程序。异常可以由程序员处理,并可以对用户纠正或转变为有意义的错误。


*使用检查异常(被强制捕获的异常)有点痛。一些(也许是大多数)开发人员发现,强制异常处理麻烦,不需要并且只是不好的做法。


2
我不同意,这个定义太有限了。应该只向用户显示例外的子集。异常是为了处理错误,通常放弃的最后一步是放弃并通知用户,这不应该成为常态。某些系统还设计为在某些流控制中也使用例外,例如可迭代结束,EOF等。
JürgenStrobel,

于尔根,我理解并完全同意您的评论。“已更正或变成了一些有意义的错误”-我不是通过此陈述传达这种想法吗?

是的,现在好多了。
尔根·斯特罗贝尔

可以说,异常永远不应该显示给用户。(导致它们生成的条件可能需要以某种方式报告给用户,而不是作为异常报告。)但是,异常总是比仅执行DIAF或意外退出的程序好。(“每次我尝试按发件人名称对电子邮件进行排序时,电子邮件客户端都会静默退出!!”无论该出口多么干净,它仍然是错误的。)
Donal Fellows

2

异常允许通过从错误处理程序中拆分错误位置来进行现代错误处理。有时这也用于流量控制。

未处理的异常会终止程序。但是这些与以前的例外没有什么不同,只是一个懒惰的程序员忘记了在每个路径中都包含适当的错误处理程序,使得它们对于最终用户是可见的。我认为异常终止的程序与任何其他意外结束一样崩溃。

操作系统非常适合清理崩溃的进程,无论它们如何崩溃,因此,除了终止发生故障的进程并释放其资源之外,异常不会为操作系统增加安全性。


操作系统可以清除的内容有限制。通常,除了简单地关闭本地连接之外,OS无法知道是否需要清除或回滚任何持久性资源(例如文件),也无法知道远程连接是否需要清除。
8bittree

2

非常简单。

  • 为了仅使程序而不是整个系统崩溃,我们拥有[良好]操作系统。
  • 要使程序崩溃而不是忽略致命错误-我们有例外。

在发明异常之前,每个函数都必须返回退出代码(错误/成功),并且必须通过向函数传递指向要设置的内存的指针来检索该函数的任何结果输出

问题在于,许多程序员不记得/不愿意为每个功能检查错误的退出代码,因此有时会忽略致命错误,从而导致无法解释的行为。

因此,决定了-当您没有考虑到错误发生时,立即崩溃!又名异常处理。


1

异常只是一种错误检测机制。就它们自己而言,它们是没有用的。

但是通过检测错误,它们允许触发容错机制,以便通过切换到无错误状态(先前的状态或新的状态)从错误状态中恢复。这样,错误不会传播到系统的其他部分。


0

存在将正常程序流(程序设计为做什么)与错误处理流分开的示例(程序如何从异常情况中恢复。

这使代码更清晰,更易于维护。

考虑两个代码段:

try:
    do1()  # this is obvoiusly a normal
    do2()  # program flow
except:
    oups()  # this is exception handling code

与此相比:

if foo():
    thing1()  # is this part of normal program flow?
else:
    thing2()  # or maybe this one? Or both? When?

当然,可以通过以下方式使用异常处理来防止程序崩溃:

try {    // very bad code
    my();
    whole();
    ugly();
    application();
    here();
} catch (Throwable t) {
    // pretend it's ok
}

但这不是现代编程语言中出现例外的原因。

您也可以使用whilebreak替代的if,但这不是什么whilebreak是。


实际上,刚好在goto及其好友中断最有用时,才处理“异常”控制流。异常的优点是它们可以跨越函数边界,并且调用方可以确定最适合捕获异常的位置。
hugomg

@hugomg:异常的另一个大优点是,它们允许在引发异常的地方和处理异常的地方之间执行资源清理和其他此类操作。
supercat 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.