阅读(2657) (16)

D编程 异常处理

2021-09-01 10:38:01 更新

Exception异常是在程序执行期间出现的问题,异常提供了一种将控制权从程序的一部分转移到另一部分的方法。 D异常处理基于三个关键字 try , catch 和 throw 。

  • throw     -  出现问题时,程序将引发异常。这是通过 throw 关键字完成的。
  • catch      -   catch 关键字用于捕获异常。
  • try           -  try 块标识了为其激活了特定异常的代码块。

假设一个块会引发异常,则方法使用 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 块捕获任何异常,您可以指定要捕获的异常类型,这取决于关键字catch后面括号中的异常声明。

try { 
   //protected code 
} 

catch( ExceptionName e ) { 
   //code to handle ExceptionName exception 
}

上面的代码捕获了 ExceptionName 类型的异常,如果要指定catch块应处理在try块中引发的任何类型的异常,则必须在括起异常声明的括号之间放置省略号...,如下所示-

try { 
   //protected code 
} 

catch(...) { 
   //code to handle any exception 
}

下面的示例引发除以零的异常。它被捕获在捕获块中。

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