异常出了问题的程序的执行期间产生了。一个D程序异常是特殊情况一个程序运行时所产生,如试图除以零的响应。
异常提供了一种从程序的一部分控制权转移到另一个。 D程序异常处理是建立在三个关键词: try, catch, 及throw.
throw: 一个程序抛出异常时,问题出现了。这是通过使用一个throw关键字。
catch: 一种程序,在要处理该问题的计划中的地位异常处理程序捕获异常。catch关键字表示异常捕获。
try: try块标识代码块的哪些特定的异常将被激活。它后跟一个或多个catch块。
假设一个块将抛出一个异常,一个方法捕获使用try和catch关键字的组合异常。try/ catch块放在围绕,可能产生异常的代码。try / catch块中的代码被称为受保护的代码,以及语法使用try/ catch语句如下所示:
try { // protected code } catch( ExceptionName e1 ) { // catch block } catch( ExceptionName e2 ) { // catch block } catch( ExceptionName eN ) { // catch block }
可以列出下多个catch语句来捕获不同类型的异常的情况下,try块在不同情况提出了多个异常。
异常可以在任何地方使用抛出在throw语句的代码块中。在throw语句的操作数确定一个类型的异常,可以是任何表达式,表达式的结果的类型决定抛出的异常的类型。
以下是零条件除法发生抛出异常的一个例子:
double division(int a, int b) { if( b == 0 ) { throw new Exception("Division by zero condition!"); } return (a/b); }捕获异常:
try块中的catch块下面的捕获的任何异常。可以指定想要什么类型的异常捕捉,这是由以下关键字捕捉出现在括号中的异常声明确定的。
try { // protected code } catch( ExceptionName e ) { // code to handle ExceptionName exception }
上面的代码将捕获一个异常的ExceptionName类型。如果您要指定一个catch块应该处理任何类型的被扔在一个try块中的异常,必须把省略号...,内附异常声明如下括号之间:
try { // protected code } catch(...) { // code to handle any exception }下面是一个例子,它抛出一个除零异常,我们捕获它在catch块。
import std.stdio; import std.string; string division(int a, int b) { string result = ""; try { if( b == 0 ) { throw new Exception("Cannot divide by zero!"); } else { result = format("%s",a/b); } } catch (Exception e) { result = e.msg; } return result; } void main () { int x = 50; int y = 0; writeln(division(x, y)); y=10; writeln(division(x, y)); }当上面的代码被编译并执行,它在读取上一节中创建的文件,并产生以下结果:
Cannot divide by zero! 5