实际上我已经思考了很长时间。我自己不是英语为母语的人,但是我仍然有多年编程经验,所以我总是问我这个问题。为什么将其命名为Exception而不是Error,因为它们是错误。
可以PageNotFoundError
代替PageNotFoundException
。
实际上我已经思考了很长时间。我自己不是英语为母语的人,但是我仍然有多年编程经验,所以我总是问我这个问题。为什么将其命名为Exception而不是Error,因为它们是错误。
可以PageNotFoundError
代替PageNotFoundException
。
Answers:
它们根本不需要是错误。页面不存在的事实可能只是一个有趣的事实,而不是实际的错误。 我承认,它们似乎几乎总是被当作错误来使用。但是有时候,它们被用来打破循环,或者让您知道字符串不是有效的数字。它们可以用来保存和返回大量有用的数据-作为相当正常的返回的一部分。(某些语言的例外情况有点慢,在这种情况下,经常抛出它们是一个坏主意。)从理论上讲,例外情况只是意味着“不要进行正常的回报,直到发现感兴趣的人后,再调用堆栈在这。”
即使是空指针异常也可能对您没有多大意义。您调用别人的代码,然后捕获一个空指针异常,因为您知道它很容易崩溃,打印一条消息,指出是谁的错误,然后继续进行工作。
for (...) { if (func() == finished) { return finished; } else { itfailedsocheckanother(); }}
但是考虑到代码中有多个要递归func()的点,每次添加更多的递归时,无异常解决方案都会变得更加难看。这就是我所说的“货物崇拜”编程,它本质上是用一种已经存在的语言模拟异常,因为邪教首领说“你不应该使用异常”。
异常机制并不总是用于表示错误。异常是在异常情况下抛出的,这种情况需要使用单独的代码路径来处理,包括错误。例如,用户提供不存在的文件名,或者在数字字段中输入字母而不是数字,这是需要特殊处理的特殊情况,但这不是错误。
在某些编程环境(例如Java)中,Error
提供了特殊对象来报告“真实错误”,而合理的应用程序不应尝试处理这种情况。这些对象使用与传递异常相同的机制进行传递,但是它们具有不可恢复情况的信号的特殊含义。
我没有关于该词源的词源研究,但我可以理解,使用“错误”一词可能并非在所有情况下都是准确的;同样,正如几乎SharepointMaster所提到的,最好将错误和异常视为单独的实体。
当您使用高级编程语言时,有理由假定异常总是由错误引起的,尽管我也同意dasblinkenlight的观点,即使那样,异常也不总是由错误引起的。例如,我使用异常来协作终止线程。
我第一次看到“例外”一词是在80386汇编手册中。我记得当我看到它对我来说立即自然。称一个错误将是不正确的,因为Assembly中没有错误。存在处理器无法处理的简单条件(如果这是错误-来自程序员,用户或系统-那么,处理器对此完全不可知)。我不知道英特尔是否真正起源于该术语,但也许...
在Python中,它们被命名为ABCError例如:KeyError,IndexError
http://docs.python.org/library/exceptions.html
因此,我认为这取决于您使用的语言。
发生错误时,系统或当前正在执行的应用程序都会通过引发包含有关错误信息的异常来报告该错误。一旦引发,异常将由应用程序或默认异常处理程序处理。
错误会引发一个详细说明该错误的异常,因此,并非所有错误都属于错误;如果这有意义,那么它就是一个例外;),例如,noneimplemetedexception应该不是一个错误,但会引发一个异常。
http://msdn.microsoft.com/zh-CN/library/system.exception.aspx
在iOS / Mac编程中,我们只有一种语言同时具有“异常”和“错误”。
至少在那种环境下,异常是“不可恢复的”,而错误是“可恢复的”。
例如:
异常通常会使您的应用程序崩溃,而错误通常会返回nil
并返回一个错误对象(作为按引用方法的参数返回)。您可以使用try / catch / finally块来捕获异常,但是建议不要使用此语言功能-如果可以以任何方式从异常中恢复,则根本不应该引发异常(应该返回错误对象)。
一个错误的东西,在程序的执行出了问题。通常,这是通过引发异常来解决的,但是
错误是一个语义概念:具有期望的程序员或用户使用它来描述他们的期望与现实之间的差异。只有一个人可以说出例程是否处于错误状态。
语法概念是一个例外:它本身就是程序中的某些东西,与任何人对该程序应该做什么的期望无关。例程会引发异常,也不会引发异常,而不管任何人的想法如何。
异常和错误是不同的。
例外是程序可以克服的情况,例如说您尝试打开一个文件但该文件不存在,而错误是程序无法执行任何操作的情况,例如磁盘故障或RAM故障。
异常是错误的概括。在第一编程语言包括异常机制是Lisp语言在70年代初期。加布里埃尔(Gabriel)和斯蒂尔(Steele)在《语言进化模式》中有一个很好的总结。异常(尚未称为异常)是由于发生错误时需要指定程序的行为而引起的。一种可能性是暂停程序,但这并不总是有帮助的。传统上,Lisp实现有一种针对错误进入调试器的方法,但是有时程序员希望在其程序中包括错误处理。因此,1960年代Lisp的实现方式有一种说法:“这样做,如果发生错误,则改为这样做”。错误最初来自原始函数,但是程序员发现故意触发错误以便跳过程序的某些部分并跳转到错误处理程序很方便。
1972年,Lisp中异常处理的现代形式出现在MacLisp中:throw
和catch
。该软件保存组列出了早期Lisp的实现,其中包括了大量的材料由大卫月亮MACLISP参考手册修订0。原始语言catch
和throw
记录在§5.3p.43中。
catch
是用于执行结构化非本地出口的LISP函数。(catch x)
评估x
并返回其值,除了在评估期间x
(throw y)
应评估时,catch
立即返回y
而无需进一步评估x
。
catch
也可以与未经评估的econd参数一起使用,该参数用作区分嵌套捕获的标记。(...)
throw
与catch
结构化的非本地退出机制一起使用。
(throw x)
评估x
并将值返回最新的catch
。
(throw x <tag>)
将x
返回的值返回到最近catch
标记为<tag>
或未标记的值。
重点是非本地控制流。这是goto的一种形式(仅向上的goto),也称为jump。隐喻是程序的一部分抛出该值以返回到异常处理程序,并且异常处理程序捕获该值并返回它。
如今,大多数编程语言都将标记和值打包在异常对象中,并将捕获机制与处理机制结合在一起。
异常不一定是错误。它们是从代码块和周围的块中退出的一种方式,转义直到到达异常的处理程序。在直觉上,这种事情是否被认为是“错误”是主观的。
一些语言在术语“错误”和“例外”之间进行区分。例如,某些Lisp方言既throw
要引发异常(用户的控制流,即要以不指示任何“错误”的方式执行非本地退出),也signal
必须引发错误(这表明出现“错误”,并可能触发调试事件)。