12.1.1 Raising Errors

Last-modified: 2025-03-22 (土) 21:51:18

12.1.1 エラーの発生

エラーの最も一般的な用途は、関数への入力引数をチェックすることです。次の例では、error関数がf入力引数なしで呼び出された場合に関数を呼び出します。

function f (arg1)
 if (nargin == 0)
   error ("not enough input arguments");
 endif
endfunction

関数が呼び出されるとerror、指定されたメッセージが出力され、Octave プロンプトに戻ります。つまり、呼び出しに続くコードはerror実行されません。

エラーに識別文字列を割り当てることもできます。エラーにそのような ID がある場合、次のセクションで説明するように、ユーザーはこのエラーをキャッチできます。エラーに ID を割り当てるには、error2 つの文字列引数で を呼び出すだけです。最初の引数は識別文字列で、2 番目の引数は実際のエラーです。エラー ID の形式は であることに注意してください"NAMESPACE:ERROR-NAME"。名前空間は "Octave"Octave 独自のエラーに使用されます。その他の文字列は、ユーザー独自のエラーの名前空間として使用できます。

: error (template, …)

: error (id, template, …)

エラー メッセージを表示し、m ファイルの実行を停止します。

テンプレート文字列テンプレートの制御下で、 printf関数ファミリーと同じ規則を使用してオプションの引数をフォーマットし (フォーマットされた出力を参照)、結果のメッセージをstderrストリームに出力します。このフォーマットは、テンプレート文字列の後に追加の引数がある場合に、一重引用符で囲まれた文字ベクトルに対してのみ行われます。追加の引数がない場合は、テンプレート文字列が文字どおりに使用されます (つまり、一重引用符で囲まれた文字ベクトル内のエスケープ シーケンスは解釈されません)。メッセージには ' がプレフィックスとして付きます。エラー:'。

オプションのid引数を使用すると、プログラマはエラーに特定の識別子をタグ付けして、ユーザーが後でそれを取得 ( lasterrまたは を使用lasterror) し、エラーの原因を知ることができるようになります。識別子には少なくとも 1 つのコロン文字 ( ':') を含める必要があり、空白文字を含めることはできません。識別子は の形式の文字列である必要があります"NAMESPACE:ERROR-NAME"。Octave 独自のエラーは "Octave"名前空間を使用します ( を参照error_ids)。たとえば、 次のようになります。

error ("MyNameSpace:wrong-type-argument",
      "fcn_name: argument should be numeric");

を呼び出すとerror、Octave の内部エラー状態も設定され、それ以上のコマンドを評価せずに制御がトップレベルに戻ります。これは、関数またはスクリプトを中止する場合に便利です。

エラー メッセージが改行文字で終わらない場合、Octave はエラーの原因となったすべての関数呼び出しのトレースバックを出力します。たとえば、次の関数定義があるとします。

function f () g (); end
function g () h (); end
function h () nargin == 1 || error ("nargin != 1"); end

この関数を呼び出すと、fエラーの正確な場所を素早く見つけるのに役立つメッセージのリストが表示されます。

f ()
error: nargin != 1
error: called from:
error:   h at line 1, column 27
error:   g at line 1, column 15
error:   f at line 1, column 15

エラー メッセージが改行文字で終わる場合、Octave はメッセージを出力しますが、制御をトップ レベルに戻すため、トレースバック メッセージは表示しません。たとえば、前の例のエラー メッセージを改行文字で終わるように変更すると、Octave は 1 つのメッセージのみを出力します。

function h () nargin == 1 || error ("nargin != 1\n"); end
f ()
error: nargin != 1

に入力されたヌル文字列 ("") はerror無視され、コードはステートメントが NOP であるかのように実行を続けます。これはMATLABとの互換性のためです。また、次のようなコードを記述することも可能になります 。

err_msg = "";
if (CONDITION 1)
 err_msg = "CONDITION 1 found";
elseif (CONDITION2)
 err_msg = "CONDITION 2 found";
...
endif
error (err_msg);

エラーが見つかった場合にのみ実行を停止します。

実装上の注意: MATLABとの互換性のため、入力引数が 2 つ以上ある限り、テンプレートが一重引用符で定義されているかどうかに関係なく、テンプレート内のエスケープ シーケンス(例: => 改行) は処理されます。エスケープ シーケンスの展開を無効にするには、シーケンスの前に 2 番目のバックスラッシュを使用するか (例: )、 関数を使用します。 "\n""\\n"regexptranslate

See also: warning, lasterror.

関数への入力に何か問題があるときにエラーを使用するのが一般的であるため、Octave はそのようなコードを簡素化する関数をサポートしています。print_usage関数が呼び出されると、関数呼び出しのヘルプ テキストが読み込まれprint_usage、役立つエラーが表示されます。ヘルプ テキストが Texinfo で記述されている場合は、ヘルプ テキストの一部で説明されている関数プロトタイプのみを含むエラー メッセージを表示できます@deftypefn。ヘルプ テキストが Texinfo で記述されていない場合は、エラー メッセージにヘルプ メッセージ全体が含まれます。

次の関数を考えてみましょう。

## -*- texinfo -*-
## @deftypefn {} f (@var{arg1})
## Function help text goes here...
## @end deftypefn
function f (arg1)
 if (nargin == 0)
   print_usage ();
 endif
endfunction

入力引数なしで呼び出されると、次のエラーが発生します。

f ()
-|  error: Invalid call to f.  Correct usage is:
-|
-|   -- f (ARG1)
-|
-|
-|  Additional help for built-in functions and operators is
-|  available in the online version of the manual.  Use the command
-|  'doc <topic>' to search the manual index.
-|
-|  Help and information about Octave is also available on the WWW
-|  at https://www.octave.org and via the help@octave.org
-|  mailing list.

: print_usage ()

: print_usage (name)

関数名の使用方法メッセージを出力します。

入力引数なしで呼び出されると、print_usage関数は現在実行中の関数の使用方法メッセージを表示します。

See also: help.

: beep ()

スピーカー(またはビジュアルベル)からビープ音を鳴らします。

この関数は、端末にアラーム文字を送信します"\a"。ユーザーの設定に応じて、ビープ音やベル音が発生するか、または何も発生しない場合があります。

See also: puts, fputs, printf, fprintf.

: val = beep_on_error ()

: old_val = beep_on_error (new_val)

: old_val = beep_on_error (new_val, "local")

エラー メッセージを印刷する前に Octave が端末のベルを鳴らすかどうかを制御する内部変数を照会または設定します。

オプションを使用して関数内から呼び出されると"local"、関数とそれが呼び出すサブルーチンに対して変数がローカルに変更されます。関数を終了すると、元の変数値が復元されます。