戻り値と例外とは? わかりやすく解説

戻り値と例外

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/21 21:57 UTC 版)

例外処理」の記事における「戻り値と例外」の解説

例外処理例外オブジェクト)をサポートしないCなどの言語では、従来から関数サブルーチン)の戻り値によってその関数(処理)の成否判定する方法がとられてきた。慣例的に関数戻り値32ビット整数値などで宣言して関数成功した場合は0を返し失敗した場合エラーコードとして何らかの負数返すことが多い。さらに簡略化して、成否結果真偽値1/0で返すだけにすることもある。戻り値ポインタ型である場合は、成功した場合有効なポインタすなわち非NULL返し失敗した場合無効なポインタすなわちNULL返すのが通例である。標準ライブラリ各種APIでは、詳細伝えエラーコード別途errnoのようなグローバル変数格納することもある。各エラーコードによって失敗の原因定義しておき、呼び出し側で原因判定するこのような戻り値による処理の成否判定には下記のような問題点がある。 戻り値無視できるため、呼び出し先でエラー発生して通常通り処理を継続するプログラム記述できてしまう。 エラーコードはたいてい32ビット整数値でしかないため、それ以上詳細な情報例え具体原因および異常発生個所などを示すエラーメッセージ)を付加することができない直前エラー情報グローバル変数格納する設計は、マルチスレッド対応の際に別途スレッドローカルストレージ化が必要となる。 戻り値毎回チェックする判定文を記述するのが煩雑である。 戻り値に正常系の値と異常系の値(エラー判定用の値)とを混在させる、あるいは正常系と異常系とで戻り値区別がつかない関数は、関数呼び出し結果戻り値を式の中でそのまま使えなくなってしまう。 3. に関連する問題として、戻り値が正常系の結果取得使えないため引数処理結果取得用に使い関数インターフェイスおよび呼び出し側のコード複雑化するという問題がある。 bool countPositiveElements(const double x[], int inNumberOfElements, int* outNumberOfElements) { if (x == NULL || inNumberOfElements <= 0 || outNumberOfElements == NULL) { return false; // 異常終了。 } *outNumberOfElements = 0; for (int i = 0; i < inNumberOfElements; ++i) { if (!isnan(x[i]) && x[i] > 0) { (*outNumberOfElements)++; } } return true; // 正常終了。} 4.の問題では関数呼び出し結果をいったんローカル変数格納することなく次の関数引数そのまま式として渡すようなこともできなくなる。例え下記C言語の例では、atof()関数戻り値が正常系と異常系とで区別がつかない仕様のため、対象フォーマット外の不正な入力があっても検知できず処理を継続してしまう。例外使わずにこの問題対処するには、正常系と異常系とを区別できるようにするために、関数実装およびインターフェイス複雑化することを許容しなければならない。 #include #include double addAsDouble(const char* x, const char* y) { return atof(x) + atof(y);}int main(void) { printf("%f\n", addAsDouble("1", "2")); printf("%f\n", addAsDouble("x", "y")); // 変換および加算結果は0となるが、無意味。} 一方文字列から数値への変換失敗した場合例外投げライブラリを持つ言語では、メインロジックに関係のないコード挿入することなく、正常系と異常系とを簡潔かつ明確に区別できる下記C#による例である。 using System;public class Test{ public static double AddAsDouble(string x, string y) { return double.Parse(x) + double.Parse(y); } public static void Main() { try { Console.WriteLine(AddAsDouble("1", "2")); Console.WriteLine(AddAsDouble("x", "y")); // 例外スローされ、処理は継続されない。 } catch { } }} 別の例として、たとえば主記憶領域容量ファイル容量取得する関数設計する際、結果符号なし整数型 (非負数) の戻り値返すように決めた場合戻り値エラー判定用の値を返すことができない。この場合、errnoのようなグローバル変数もしくは別途用意した関数引数経由エラーコード返して呼び出し側で判定する必要がある。たとえばWindows APIのGetFileSize()関数戻り値ファイルサイズ返すが、混合した設計となっており、エラーが発生した場合は-1を返す。しかし戻り値の型はDWORDつまり符号なし32ビット整数型であるため、実際には0xFFFFFFFFが返却される。これは本来正常値としてありうる値であり、異常系との区別付かないため、エラーによる結果だったかどうかを判定するにはGetLastError()関数呼び出し別途必要になっている。なおGetFileSizeEx()関数成否戻り値で、正常系出力引数返す設計となっており、GetFileSize()関数代替として推奨されている。また、C言語において身近な例としてはmallocおよびcalloc、realloc関数あげられる。これらは確保要求する容量として0を指定したときC言語規格としてNULL返して良い定義されている。このためこれらの関数戻り値では記憶空間容量不足引数に0を指定した判断できず切り分けのためにerrnoを調べるか引数調べ必要があるC++において同等new演算子ではこの点を容量不足のときだけ例外投げることによって改善している。 言語レベルでの例外処理はこれらの欠点解消し例外確実に、かつ統一的に処理する目的導入されたものと言える

※この「戻り値と例外」の解説は、「例外処理」の解説の一部です。
「戻り値と例外」を含む「例外処理」の記事については、「例外処理」の概要を参照ください。

ウィキペディア小見出し辞書の「戻り値と例外」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「戻り値と例外」の関連用語

戻り値と例外のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



戻り値と例外のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの例外処理 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS