公開日: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 |
|
ブロック内任意箇所への出口処理の明示
|
─
|
─
|
─
|