英语单词“Exception”
安不寻常的,非凡的发生。低概率发生。例如
对,人们偶尔会在没有降落伞的情况下从飞机上摔下来,但那是例外情况而不是规则.
通常不做的事情,违反规则,通常对某人有利。例如
你说的我再说一遍你更喜欢英俊的男人,但对我来说你会破例.
另请参见例外除非明确表示异常糟糕,具有以下含义好的,高于平均的例如。
强化学校是一所优秀学生的学习场所。非常好
这是一个美好而特殊的日子。非常好
我看到过许多腐朽的废墟,而这一片却异常腐朽。异常衰败。
“对……破例”是一种正式的维多利亚时代英语短语,表示你感到被侮辱,言语超出了可接受的范围。“先生,我不同意你对我母亲性行为的评论。我要求你决斗。”
“异常”作为编程术语
是的,这是我写作的主要目的例外情况是程序性的 程序设计 语言设计用于处理异常或错误条件。中的例外程序设计判断力通常很差。例如这个程序抛出异常并崩溃预计起飞时间。
异常可以视为转到伪装。虽然这是真的,但确实如此值得记住的是控制流程声明,如果 然后 其他的阻碍,for循环第页,while循环第页,案例等都是伪装的。所有这些都是对使用raw的改进非结构化goto,其中包括被认为有害用于一般用途,如果您有结构化的替换它们。异常没有什么不同,非常值得使用,而不是尝试检查您调用的每个函数的返回值。埃克尔解释:
如果你仔细检查错误每次你打电话给方法,您的代码会变成一场无法阅读的噩梦。“例外”一词的意思是“我对此表示反对”。当问题发生时,你可能不知道该怎么办,但你知道你不能只是愉快地继续下去,你必须停下来,在某个地方,有人必须想办法做什么。
..他们会清理错误处理代码。您不再需要在方法调用时进行检查,而不是检查特定错误并在程序中的多个位置进行处理。。。你只需要在一个地方处理问题异常处理程序
-来自Java编程思想,第10章“异常错误处理”埃克尔.
例外情况是抛出的发生错误时。正常程序流为中断,控制传递给最近的封闭异常处理程序,然后恢复正常的控制流。由于代码显式执行此操作或由于打断从操作系统。如果这听起来很奇怪,也很难理解,那么先看看例子。
自从Exceptions在面向对象编程,在大多数语言中,例外是对象,可以查询其类型和属性。
我将用我使用的编程语言做一些示例,德尔福.德尔福异常模型与蟒蛇和C类#.Java语言使用基本相似的模型,但有以下细微差异:
- Java的catch关键字使用不同的语法,而不是except来捕获和处理异常。
- 所有java方法都必须声明可能引发的异常。调用方法时,调用方方法必须捕获被调用方抛出的所有异常,否则必须在自己的抛出列表中声明这些异常。这是由编译器强制执行的。
您的里程数可能因其他语言而异。无论如何,以下是Delphi代码示例://函数崩溃,但程序将恢复
功能算术异常:双精度;
无功功率,无功功率
MyZero:双倍;
开始
MyZero:=0;
结果:=10/MyZero;//砰!-将引发异常!!!
ShowMessage(“您不会看到此内容”);
结束;
程序TryIt;
开始
尝试
算术异常;
除了
显示消息(“Bang”);
结束;
结束;
调用TryIt时会发生什么?在被零除,一个例外是抛出的.正常的执行流停止堆栈直到最近的找到封闭的try-except块。在这种情况下,它就在不远处。结果调用TryIt只是消息“Bang”。
Finally块
另一种异常处理形式,try。。最后块用于无论发生什么情况,都要确保运行一段代码,即使出现异常抛出。这通常用于确保释放分配的资源。 例如,如果您的代码为:
功能ThisMayFail:双倍;
无功功率,无功功率
lcSomeObj:TBigExpensiveObject;
开始
lcSomeObj:=TBigExpensiveObject。创建;
lcSomeObj.SomeRiskyOperation;
lcSomeObj.SomeRisky操作;
结果:=lcSomeObj.GetResultValueFromTheNetherDepths;
lcSomeObj.Free;
结束;
如果在某些风险操作期间抛出异常,对象将永远不会释放,内存就会泄漏。以下代码更好:
功能ThisMayFail:双倍;
无功功率,无功功率
lcSomeObj:TBigExpensiveObject;
开始
lcSomeObj:=TBigExpensiveObject。创建;
尝试
lcSomeObj.SomeRisky操作;
lcSomeObj.SomeRisky操作;
结果:=lcSomeObj.GetResultValueFromTheNetherDepths;
最后
lcSomeObj.Free;
结束;
结束;
现在可以保证在正常执行中,或者即使异常是抛出,事实上总是(除非灾难例如电源故障、操作系统崩溃或用户强制终止整个程序,在这种情况下,内存泄漏无关紧要)对象将被释放。这将在正常的语句序列中发生,或者在抛出异常时发生。
高级尝试。。除:
有几种常见的尝试变化。。块除外:
如果您认为有必要,可以手动提出例外。
如果pObject=零然后
升起TMy异常。创建('someproc'中的零指针');
这也证明了你可以自己做子类异常,并按照下面的示例进行测试。
你可以压制例外。
程序TryIt;
开始
尝试
算术异常;
除了
//出现错误时,不采取任何措施
结束;
结束;
这种风格是我最讨厌的。Try-except块不能替代良好的代码或调试。这不是没有错误的代码,这是错误代码。应报告错误,以便修复错误,例如。
程序TryIt;
开始
尝试
算术异常;
除了
上的E: 例外做
ShowMessage(“Failed ArithmeticException with error”+E.ClassName+“:”+E.Message);
结束;
结束;
这会产生一条很好的错误消息“失败的ArithmeticException,出现错误EZeroDivide(EZeroDivide):浮点 被零除“。如果对话框不适合您的程序(可能是一个无人值守的服务器任务,必须继续运行),则记录错误并继续。只是不要忽略它。
这也说明了异常是对象。
您可以根据异常对象的类型(全部异常类型为Exception或其子类之一)。这也很好练习-你不想告诉用户他们输入的文本当实际错误是操作系统已运行时,无法转换为字符串内存不足:
程序TryIt;
开始
尝试
算术异常;
除了
上的E: EMath错误做
ShowMessage(“失败,出现数学错误”+E.ClassName+“:”+E.Message)
其他
升高;
结束;
结束;
在这种情况下,EMathError是EZeroDivide的基类以及所有其他可能出错的数字。所有其他错误将是传递到下一次封闭尝试。。块除外。如果没有找到,则将调用包含整个程序的默认处理程序,并向您显示讨厌的对话框。