Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

MException

エラー情報を取得する

説明

エラーを検出して例外をスローする MATLAB® コードは、すべて MException オブジェクトを構築します。MException オブジェクトには取得可能なエラー情報が含まれています。MATLAB は事前定義された例外または自分で構築した例外をスローできます。

作成

説明

ME = MException(errID,msgtext) は、特定のエラーについての情報を取得して、MException オブジェクト ME に保存します。MException オブジェクトは、エラー識別子 errID およびエラー メッセージ msgtext を使用して構築されます。

ME = MException(errID,msgtext,A1,...,An) は、テキストまたは数値 A1,...,An を使用してエラー メッセージの書式を設定し、msgtext の変換指定子を実行時に置き換えることができます。

入力引数

すべて展開する

エラーの識別子。文字ベクトルまたは string スカラーとして指定します。例外処理でエラー識別子を使用すると、エラー原因を特定したり、プログラム内の例外のサブセットを選択して制御したりできます。

エラー識別子には 1 つ以上の "コンポーネント" フィールドと 1 つの "ニーモニック" フィールドが含まれます。フィールドはコロンで区切られなければなりません。たとえば、コンポーネント フィールド component およびニーモニック フィールド mnemonic をもつエラー識別子は 'component:mnemonic' として指定します。

  • 一般に、コンポーネント フィールドは、さまざまなエラーが生成される可能性のある製品や機能を指定します。たとえば、エラー識別子 'MATLAB:TooManyInputs' にはコンポーネント フィールド MATLAB があります。これは、MATLAB で例外がスローされることを意味します。異なるコンポーネントを前に追加する限り、同じニーモニック TooManyInputs を再使用できます。たとえば、多すぎる入力で関数が呼び出されるたびにツールボックスで例外をスローする場合は、'MyToolbox:TooManyInputs' を使用できます。

  • エラー識別子のニーモニック フィールドは、一般に、エラーの問題に固有のタグです。たとえば、MATLAB であいまいな構文の使用の結果として生じるエラーを報告する場合、エラー識別子を 'MATLAB:ambiguousSyntax' として指定できます。

コンポーネント フィールドとニーモニック フィールドはそれぞれ、文字で始まらなければなりません。残りの文字には英数字 (A ~ Z、a ~ z、0 ~ 9) とアンダースコアを使用できます。errID には空白文字は使用できません。

例: 'MyComponent:noSuchVariable'

例: 'Simulink:Signals:InvalidNumberOfPorts'

エラー原因に関する情報とその修正方法。文字ベクトルまたは string スカラーとして指定します。テキストの書式を設定するには、\t\n などのエスケープ シーケンスを使用します。関数 sprintf によってサポートされる %s%d などの書式指定子も使用できます。A1,...,An 入力引数を使用して変換指定子の値を指定します。

例: 'Error opening file.'

例: 'Error on line %d.'

msgtext 内の変換指定子と置き換える値。それぞれ、文字ベクトル、string スカラー、または数値スカラーとして指定します。

プロパティ

すべて展開する

このプロパティは読み取り専用です。

エラーを一意に識別する文字ベクトル。入力引数 errID によって文字ベクトルとして指定します。

例: 'MATLAB:test'

このプロパティは読み取り専用です。

MATLAB が例外をスローする際に表示されるエラー メッセージを含む文字ベクトル。msgtext 入力引数と A1,...,An 入力引数により指定します。

例: 'Variable x not found'

このプロパティは読み取り専用です。

ファイル名 (file)、関数名 (name) および行番号 (line) などの、MATLAB が例外をスローする場所のスタック トレース情報を含む構造体配列です。呼び出された関数でエラーが発生すると、呼び出された関数それぞれのファイル名、関数名および行番号が stack プロパティに含まれます。MATLAB は例外をスローする場合にのみスタックを生成します。

stack は N 行 1 列の struct 配列です。N は呼び出しスタックの深さを表します。

このプロパティは読み取り専用です。

MATLAB が例外を作成する原因となった MException オブジェクトの cell 配列。addCause メソッドを使用して、例外を cause プロパティに追加します。

このプロパティは読み取り専用です。

例外の修正候補。matlab.lang.correction.AppendArgumentsCorrection オブジェクト、matlab.lang.correction.ConvertToFunctionNotationCorrection オブジェクト、または matlab.lang.correction.ReplaceIdentifierCorrection オブジェクトとして指定します。例外がスローされ、キャッチされない場合、MATLAB は Correction プロパティを使用して例外の修正を提案します。

オブジェクト関数

throw例外のスロー
MException.last最新のキャッチされていない例外を返す
rethrow前回キャッチされた例外を再度スローする
throwAsCaller呼び出し元の関数内で発生しているかのように例外をスロー
addCause例外の追加の原因を記録する
addCorrection例外の修正候補の提案
getReport例外のエラー メッセージを取得する

すべて折りたたむ

MException オブジェクトを作成して、入力エラーについての情報を取得します。

errID = 'myComponent:inputError';
msgtext = 'Input does not have the expected format.';

ME = MException(errID,msgtext)
ME = 
  MException with properties:

    identifier: 'myComponent:inputError'
       message: 'Input does not have the expected format.'
         cause: {}
         stack: [0x1 struct]
    Correction: []

msgtextA1,...,An の入力引数の両方を使用してエラー メッセージを作成します。

errID = 'MATLAB:test';
msgtext = 'There are %d errors on this page';
A1 = 10;

ME = MException(errID,msgtext,A1)
ME = 
  MException with properties:

    identifier: 'MATLAB:test'
       message: 'There are 10 errors on this page'
         cause: {}
         stack: [0x1 struct]
    Correction: []

入力変数名がワークスペースにない場合に例外をスローします。

str = input('Type a variable name: ','s');
if ~exist(str,'var')
    ME = MException('MyComponent:noSuchVariable', ...
        'Variable %s not found',str);
    throw(ME)
end

入力プロンプトでは、ワークスペースにない変数を入力します。たとえば、notaVariable を入力します。

Variable notaVariable not found

ワークスペースに notVariable が存在しないため、MATLAB は MException オブジェクトを作成しスローします。

try, catch を使用して MException オブジェクトで取得された情報にアクセスします。

関数 surf への入力なしの呼び出しを含むファイル myfile.m を作成します (この関数の呼び出しは結果的に例外となりますが、説明を分かりやすくするためにそうしています)。MATLAB がスローする例外を MException オブジェクト ME でキャッチし、MEmessage プロパティにアクセスしてエラー メッセージを表示します。

try
    surf
catch ME
    disp('Error Message:')
    disp(ME.message)
end
Error Message:
Not enough input arguments.

エラー識別子を抽出します。

ME.identifier
ans =

    'MATLAB:narginchk:notEnoughInputs'

stack プロパティの内容をクエリします。この例では、呼び出しスタックは 2 行 1 列の構造体配列で表されます。

for i = 1:numel(ME.stack)
    ME.stack(i)
end
ans = 

  struct with fields:

    file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
    name: 'surf'
    line: 49


ans = 

  struct with fields:

    file: 'c:\myMATLABfiles\myfile.m'
    name: 'myfile'
    line: 2

stack の最初の要素は例外が発生したときのファイル名 (surf.m)、関数名 (surf)、行数 (49) を表示します。stack の 2 番目の要素は、呼び出し元のスクリプトで例外が発生した名前と行数を示します。

存在しない関数 notaFunction を呼び出すことで生成された例外を検出します。関数が定義されていないと、警告を発行して出力に値 0 を割り当てます。

try
    a = notaFunction(5,6);
catch ME
    if strcmp(ME.identifier,'MATLAB:UndefinedFunction')
        warning('Function is undefined.  Assigning a value of 0.');
    else
        rethrow(ME)
    end
end
Warning: Function is undefined.  Assigning a value of 0. 

notaFunction への呼び出しは、それ自体がエラーになります。このコードで trycatch を使用して未定義の関数の例外を検出し、警告として再パッケージ化することで、MATLAB は引き続き後続のコマンドを実行することができます。検出された例外のエラー識別子が異なる場合、MATLAB は例外を再スローします。

R2007b で導入