アーカイブ

第6章 3.各プログラミング言語におけるエラーハンドリング

公開日:2007年9月26日

独立行政法人情報処理推進機構
セキュリティセンター

本ページの情報は2007年9月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。

コラム: 各プログラミング言語におけるエラーハンドリング

C、C++およびこれらから影響を受けているいくつかのプログラミング言語について、例外処理とリソース解放のための構文およびランタイム機能の対比を、次のふたつの表に示す。なお、参考のためRuby言語についても掲載した。
 

表1:例外処理とリソース解放の構文の対比(C, C++, VisualC++, D)

分類
 
機能性
プログラミング言語
C
C++
Visual C++
D
例外
例外の発火
throw 例外;
throw 例外;
throw 例外;
例外の型
任意のスカラ型および、任意のオブジェクト型
任意のスカラ型および、任意のオブジェクト型
ThrowableもしくはExceptionのサブクラス
例外の捕捉
try{
 処理
}catch(
宣言){
 例外処理
}
try{
 処理
}catch(
宣言){
 例外処理
}__finally{
 出口処理
}
try{
 処理
}catch(
宣言){
 例外処理
}finally{
 出口処理
}
リソース解放
ガーベジコレクション
あり
暗黙のデストラクタ呼び出し
あり
あり
あり
出口でリソースが自動解放されるブロック
ブロック末尾への出口処理の明示
try{
 処理
}__finally{
 出口処理
}
try{
 処理
}finally{
 出口処理
}
ブロック内任意箇所への出口処理の明示
{
...
初期化
scope(
種類)出口処理
...
}
種類 はfailue, success, exitのいずれか

 

表2:例外処理とリソース解放の構文の対比(C#, Java, Ruby)

分類
 
機能性
プログラミング言語
C#
Java
Ruby
例外
例外の発火
throw 例外;
throw 例外;
raise 例外
例外の型
System.Exceptionのサブクラス
ThrowableもしくはExceptionのサブクラス
Exceptionのサブクラス
例外の捕捉
try{
 処理
}catch(
宣言){
 例外処理
}finally{
 出口処理
}
try{
 処理
}catch(
宣言){
 例外処理
}finally{
 出口処理
}
begin
 処理
rescure 
宣言
 例外処理
else
 正常時処理
ensure
 出口処理
end
リソース解放
ガーベジコレクション
あり
あり
あり
暗黙のデストラクタ呼び出し
出口でリソースが自動解放されるブロック
using(初期化){
 処理
}
自動解放できるのはIDisposableを実装しているクラスのオブジェクト
try(初期化){
 処理
}
自動解放できるのはAutoClosableを実装しているクラスのオブジェクト。Java 7以降
メソッド呼び出し {
 |パラメタ| 処理
}
ただし、メソッドの側で、初期化→ブロック実行→リソース解放 を行うようになっている必要あり
ブロック末尾への出口処理の明示
try{
 処理
}finally{
 出口処理
}
try{
 処理
}finally{
 出口処理
}
begin
 処理
ensure
 出口処理
end
ブロック内任意箇所への出口処理の明示