12.1.2 Catching Errors

Last-modified: 2025-03-22 (土) 21:52:28

12.1.2 エラーのキャッチ

エラーが発生した場合は、 「try ステートメント」tryで説明されているように、ステートメントを使用してエラーを検出し、処理できます。例として、次のコードはループ中に発生したエラーの数をカウントします。 for

number_of_errors = 0;
for n = 1:100
 try
   ...
 catch
   number_of_errors++;
 end_try_catch
endfor

上記の例では、すべてのエラーを同じように扱っています。しかし、多くの場合、エラーを区別し、エラーに応じて異なるアクションを実行する必要があります。このlasterror 関数は、最後に発生したエラーに関する情報を含む構造体を返します。たとえば、上記のコードを変更して、「*' 演算子。

number_of_errors = 0;
for n = 1:100
 try
   ...
 catch
   msg = lasterror.message;
   if (strfind (msg, "operator *"))
     number_of_errors++;
   endif
 end_try_catch
endfor

あるいは、関数の出力は、キーワードlasterrorの直後に指定された変数で見つけることができますcatch。次の例では、エラーを警告としてリダイレクトする方法を示しています。

try
 ...
catch err
 warning(err.identifier, err.message);
 ...
end_try_catch

: lasterr = lasterror ()

: lasterror (err)

: lasterror ("reset")

最後のエラー メッセージ構造を照会または設定します。

引数なしで呼び出されると、最後のエラー メッセージとこのエラーに関連するその他の情報を含む構造体を返します。構造体の要素は次のとおりです。

message
最後のエラーメッセージのテキスト
identifier
このエラーメッセージのメッセージ識別子
stack
メッセージが発生した場所に関する情報を含む構造体。情報を取得できない場合は、空の構造体になることがあります。構造体のフィールドは次のとおりです。
file
エラーが発生したファイルの名前
name
エラーが発生した関数の名前
line
エラーが発生した行番号
column
エラーが発生した列番号を示すオプションのフィールド

最後のエラー構造体は、スカラー構造体 errを入力として渡すことによって設定できます。上記のものと一致するerrのフィールドはすべて設定され、指定されていないフィールドはデフォルト値で初期化されます。

lasterrorが引数 で呼び出されると"reset"、すべてのフィールドがデフォルト値に設定されます。

See also: lasterr, error, lastwarn.

: [msg, msgid] = lasterr ()

: lasterr (msg)

: lasterr (msg, msgid)

最後のエラー メッセージを照会または設定します。

入力引数なしで呼び出されると、最後のエラー メッセージとメッセージ識別子を返します。

引数を 1 つ指定すると、最後のエラー メッセージがmsgに設定されます。

引数が 2 つある場合は、最後のメッセージ識別子も設定します。

See also: lasterror, error, lastwarn.

次の例では、インデックス エラーをカウントします。エラーは、関数によって返される構造体のフィールド識別子を使用して検出されますlasterror。

number_of_errors = 0;
for n = 1:100
 try
   ...
 catch
   id = lasterror.identifier;
   if (strcmp (id, "Octave:invalid-indexing"))
     number_of_errors++;
   endif
 end_try_catch
endfor

Octave とともに配布される関数は、次のいずれかのエラーを発行する可能性があります。

Octave:bad-alloc
メモリを割り当てることができなかったことを示します。

Octave:invalid-context
呼び出されたスコープ内で実行できない操作によってエラーが生成されたことを示します。たとえば、関数が print_usage ()Octave プロンプトから呼び出されると、このエラーが発生します。

Octave:invalid-fun-call
関数が間違った方法で呼び出されたことを示します (例: 入力引数の数が間違っている)。

Octave:invalid-indexing
データ型が誤ってインデックスされたことを示します。例: 配列の実数値インデックス、構造体の存在しないフィールドなど。

Octave:invalid-input-arg
関数が無効な入力引数で呼び出されたことを示します。

Octave:undefined-function
定義されていない関数の呼び出しを示します。関数は存在する可能性がありますが、Octave は検索パスでそれを見つけることができません。

エラーが処理されたら、それを再度発生させることができます。これは、エラーを検出する必要があるが、プログラムを中止する必要がある場合に役立ちます。これは、rethrow関数を使用して可能です。前の例を変更して、'*' 演算子を使用しますが、別の種類のエラーが発生した場合は中止します。

number_of_errors = 0;
for n = 1:100
 try
   ...
 catch
   msg = lasterror.message;
   if (strfind (msg, "operator *"))
     number_of_errors++;
   else
     rethrow (lasterror);
   endif
 end_try_catch
endfor

: rethrow (err)

errで定義された以前のエラーを再発行します。

err は、少なくとも"message" および"identifier"フィールドを含む必要がある構造体です。err には"stack"、エラーの想定される場所に関する情報を提供するフィールドを含めることもできます 。通常、 errは から返されますlasterror。

See also: lasterror, lasterr, error.

: err = errno ()

: err = errno (val)

: err = errno (name)

システム依存変数 errno を照会または設定します。

入力なしで呼び出された場合は、errno の現在の値を返します。

数値入力valで呼び出されると、 errno の現在の値が指定された値に設定されます。 errno の以前の値はerrとして返されます。

文字列nameで呼び出されると、指定されたエラー コードに対応する errno の数値を返します。nameが認識されたエラー コードでない場合は、-1 が返されます。

See also: errno_list.

: S = errno_list ()

システム依存の errno 値を含む構造体を返します。

See also: errno.