このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

例外に関する情報の取得

概要

MATLAB® が例外をスローすると、MException オブジェクトと呼ばれるデータ構造でエラーの原因に関する情報が収集されます。このオブジェクトは、MATLAB MException クラスのインスタンスです。プログラムが停止する前に例外を "キャッチ" したり、catch コマンドでこの特定のエラーに対して作成されたオブジェクトにアクセスすることによって、MException オブジェクトにアクセスできます。独自のコードのエラーに応答して例外がスローされた場合は、新しい MException オブジェクトを作成してそのオブジェクトにエラーに関する情報を格納しなければなりません。

この節では、MException クラスとこのクラスから作成されたオブジェクトについて述べます。

このクラスの使用方法の詳細は、例外への応答例外のスローの後半の節に説明されています。

MException クラス

次の図は、MException クラスのオブジェクトで可能な構成の 1 つを示しています。オブジェクトには identifiermessagestackcause および Correction の 5 つのプロパティがあります。これらの各プロパティは、MException オブジェクトを表す構造体のフィールドとして実装されます。stack フィールドは追加の構造体からなる N 行 1 列の配列で、各フィールドでは呼び出しスタックからの関数、行番号が識別されます。cause フィールドは、それぞれが現在のフィールドに関連している例外を表す、MException オブジェクトからなる M 行 1 列の cell 配列です。

これらのプロパティの詳細は、MException クラスのプロパティを参照してください。

オブジェクト コンストラクター

エラーを検出して例外をスローするコードでは、エラーについての情報を記録して送信する MException オブジェクトも作成しなければなりません。MException コンストラクターの構文は、次のようになります。

ME = MException(identifier, message)

identifier は以下の形式の MATLAB メッセージ識別子です。

component:mnemonic

これは一重引用符で囲まれます。message はエラーを表すテキストで、一重引用符で囲まれます。出力 ME は、結果の MException オブジェクトです。

例外をスローするのでなく例外に応答する場合は、MException オブジェクトを作成する必要はありません。このオブジェクトは、エラーをはじめに検出したコードによって既に作成されています。

MException クラスのプロパティ

MException クラスにはいくつかのプロパティがあります。これらの各プロパティは、MException オブジェクトを表す構造体のフィールドとして実装されます。これらの各プロパティについては、以下の節で説明します。また、例外への応答例外のスローの節で参照されています。すべては読み取り専用で、値を変更することはできません。

MException プロパティは、以下のとおりです。

入力なしで関数 surf を呼び出すと、MATLAB は例外をスローします。例外をキャッチすると、MException オブジェクト構造体のプロパティを確認できます。この例では、一般的ではない方法で try/catch を使用します。try/catch の使用方法の詳細は、try/catch ステートメントの節を参照してください。

try
    surf
catch ME
    ME
end

これをコマンド ラインで実行すると、MATLAB によって MException オブジェクトの内容が返されます。

ME = 

  MException with properties:

    identifier: 'MATLAB:narginchk:notEnoughInputs'
       message: 'Not enough input arguments.'
         cause: {}
         stack: [1×1 struct]
    Correction: []

stack フィールドは、ファイル名、関数、例外がスローされた行番号を示します。

ME.stack
ans = 
    file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
    name: 'surf'
    line: 54

この場合、cause および Correction フィールドは空です。各フィールドの詳細は、以下の節で説明します。

メッセージ識別子

メッセージ識別子とは、MATLAB でエラーまたは警告を一意に識別できるように、エラーまたは警告ステートメントに付けられるタグです。メッセージ識別子は、エラー レポートでエラー ソースを特定するために使用できます。または、警告で使用してプログラム内の選択した警告のサブセットをコントロールすることもできます。

メッセージ識別子とは、エラーまたは警告に "component" および "mnemonic" ラベルを指定する、読み取り専用の文字ベクトルです。簡単な識別子の形式は、次のようになります。

component:mnemonic

コロンは、識別子の 2 つの部分、componentmnemonic を区切ります。識別子に複数の component を使用する場合は、それらを区切るコロンを追加しなければなりません。メッセージ識別子は、常に少なくとも 1 つのコロンを含まなければなりません。

以下にメッセージ識別子の例を示します。

MATLAB:rmpath:DirNotFound
MATLAB:odearguments:InconsistentDataType
Simulink:actionNotTaken
TechCorp:OpenFile:notFoundInPath

component および mnemonic フィールドはいずれも、次の構文規則に従います。

  • 識別子には、空白 (スペースまたはタブ) は使用できません。

  • 最初の文字はアルファベットにしなければなりませんが、大文字または小文字を使用できます。

  • 残りの文字には、英数字またはアンダースコアを使用できます。

component または mnemonic のいずれにも長さの制限はありません。識別子は、空の文字ベクトルにすることもできます。

Component フィールド-  component フィールドでは、さまざまなエラーや警告を生成する広範なカテゴリを指定します。一般的な component は、特定の製品またはツールボックス名です。 たとえば、MATLAB または Control、あるいは会社名 (上の例では TechCorp) などです。

このフィールドを使って複数レベルの要素を指定することもできます。次のステートメントには、3 つのレベル要素に続いて mnemoric ラベルがあります。

TechCorp:TestEquipDiv:Waveform:obsoleteSyntax

component フィールドによって、各識別子が一意であることを保証できます。このように、内部の MATLAB コードでは、MATLAB:InconsistentDataType などの特定の警告識別子を使用する場合がありますが、そのことによって同じニーモニックを使用できなくなることはありません。ただし、そのニーモニックの前に独自のコンポーネントを挿入する必要があります。たとえば、

warning('TechCorp:InconsistentDataType', ...
   'Value %s is inconsistent with existing properties.' ...
   sprocketDiam)

Mnemonic フィールド-  mnemonic フィールドは、通常、特定のメッセージに関連するタグとして使用されます。たとえば、あいまいな構文を使用した結果、エラーが出力されるような場合は、次のような簡単な component と mnemonic を使うのが適切です。

MATLAB:ambiguousSyntax

MException オブジェクトのメッセージ識別子-  例外をスローする際には、適切な識別子を作成し、次の構文を使用してオブジェクトを作成するときに MException オブジェクトにこの識別子を保存します。

ME = MException(identifier, text)

たとえば、

ME = MException('AcctError:NoClient', ...
      'Client name not recognized.');

ME.identifier
ans =
    AcctError:NoClient

例外に応答する際には、ここで示すように、MException オブジェクトからメッセージ識別子を抽出できます。ここでも、surf の例を使用します。

try
    surf
catch ME
    id = ME.identifier
end

id =
    MATLAB:narginchk:notEnoughInputs

エラー メッセージのテキスト

MATLAB のエラー メッセージは、プログラム コードから発行される読み取り専用の文字ベクトルで、MException オブジェクトに返されます。このメッセージは、ユーザーが原因を特定したり、場合によってはエラーを修正するのにも役立ちます。

例外をスローする場合には、適切なエラー メッセージを作成し、次の構文を使用してオブジェクトを作成するときに MException オブジェクトにこのエラー メッセージを保存します。

ME = MException(identifier, text)

メッセージが、関数 sprintf で使用できるような書式仕様を必要とする場合は、MException コンストラクターに対して次の構文を使用します。

ME = MException(identifier, formatstring, arg1, arg2, ...)

たとえば、

S = 'Accounts';  f1 = 'ClientName';
ME = MException('AcctError:Incomplete', ...
      'Field ''%s.%s'' is not defined.', S, f1);

ME.message
ans =
    Field 'Accounts.ClientName' is not defined.

例外に応答する場合は、以下のように、MException オブジェクトからエラー メッセージを抽出できます。

try
    surf
catch ME
    msg = ME.message
end

msg =
    Not enough input arguments.

呼び出しスタック

MException オブジェクトの stack フィールドは、エラーが検出された行番号、関数、ファイル名を識別します。次の例のように、呼び出された関数でエラーが発生すると、stack フィールドには直接のエラーの位置だけでなく、呼び出している関数それぞれの、行番号、関数名、ファイル名も含まれます。この場合、stack は N 行 1 列の配列です。N は呼び出しスタックの深さを表します。つまり stack フィールドは、例外が発生した関数の名前と行番号と、呼び出し側、さらにその呼び出し側など、最上位の関数までのファイル名と行番号を表示します。

例外をスローする場合、MATLAB では stack フィールドに呼び出しスタックの情報が格納されます。このフィールドには書き込むことができません。アクセスは読み取り専用です。

たとえば、2 つの別々のファイルにある 3 つの関数を考えます。

 mfileA.m
=========================
        .
        .
42 function A1(x, y)
43 B1(x, y);



 mfileB.m
=========================
        .
        .
 8 function B1(x, y)
 9 B2(x, y)
        .
        .
26 function B2(x, y)
27      .
28      .
29      .
30      .
31 %  Throw exception here

変数 ME の例外をキャッチしてから、stack フィールドを調べます。

for k=1:length(ME.stack)
    ME.stack(k)
end

ans = 
    file: 'C:\matlab\test\mfileB.m'
    name: 'B2'
    line: 31
ans = 
    file: 'C:\matlab\test\mfileB.m'
    name: 'B1'
    line: 9
ans = 
    file: 'C:\matlab\test\mfileA.m'
    name: 'A1'
    line: 43

配列 Cause

状況によっては、実行停止の原因となった 1 つのコマンドに関する情報だけでなく、コードがキャッチした他の例外に関する情報を記録することが重要になります。これらの追加の MException オブジェクトを、最初の例外の cause フィールドに保存できます。

MExceptioncause フィールドは、関連する MException オブジェクトのオプションの cell 配列です。cause cell 配列にオブジェクトを追加する場合は、以下の構文を使用しなければなりません。

primaryException = addCause(primaryException, secondaryException)

この例では、配列 D の変数 X への代入を試みます。D 配列が存在しない場合、コードではこの配列を MAT ファイルからの読み込み、X へ代入しようと試みられます。読み込みが失敗すると、新しい MException オブジェクト (ME3) が、最初の 2 つのエラー (ME1ME2) の原因を格納するために作成されます。

try
    X = D(1:25)
catch ME1
    try
        filename = 'test200';
        load(filename);
        X = D(1:25)
    catch ME2
        ME3 = MException('MATLAB:LoadErr', ...
               'Unable to load from file %s', filename);
        ME3 = addCause(ME3, ME1);
        ME3 = addCause(ME3, ME2);
    end
end

ME3 の cause フィールドには、2 つの例外があります。

ME3.cause
ans = 
    [1x1 MException]
    [1x1 MException]

ME3cause フィールドを調べて、関連するエラーを参照します。

ME3.cause{:}
ans =

	MException object with properties:

    identifier: 'MATLAB:UndefinedFunction'
       message: 'Undefined function or method 'D' for input 
arguments of type 'double'.'
         stack: [0x1 struct]
         cause: {}
ans =

	MException object with properties:

    identifier: 'MATLAB:load:couldNotReadFile'
       message: 'Unable to read file test204: No such file or 
directory.'
         stack: [0x1 struct]
         cause: {}

修正

一部の例外には修正があり、例外の発生時に推奨されることがあります。例外をスローしている場合、matlab.lang.correction.AppendArgumentsCorrectionmatlab.lang.correction.ConvertToFunctionNotationCorrection、または matlab.lang.correction.ReplaceIdentifierCorrection オブジェクトを作成し、それを例外の Correction フィールドに追加することで修正を推奨できます。

修正を Correction フィールドに追加する場合には次の構文を使用しなければなりません。

primaryException = addCorrection(baseException, exceptionCorrection)

この例では、入力引数を 1 つ必要とする関数 hello を作成します。この関数を入力なしで呼び出す場合、MATLAB はエラーを生成し、入力引数 "world" を修正として推奨します。

function hello(audience)
if nargin < 1
    me = MException('MATLAB:notEnoughInputs', 'Not enough input arguments.');
    aac = matlab.lang.correction.AppendArgumentsCorrection('"world"');
    me = addCorrection(me, aac);
    throw(me)
end
fprintf("Hello, %s!\n", audience)
end

関数を引数なしで呼び出すと、MATLAB は修正を推奨します。

hello
Error using hello (line 6)
Not enough input arguments.

Did you mean:
>> hello("world")

MException クラスのメソッド

MException クラスで使用できるメソッドはいくつかあります。これらのメソッドの名前では、大文字と小文字が区別されます。詳細は、関数 MATLAB のリファレンス ページを参照してください。

メソッド名説明
addCauseMException を別の MExceptioncause フィールドに追加します。
addCorrection現在の例外のための推奨される修正を提供します。
getReport現在の例外に基づいて、書式設定されたメッセージを返します。
MException.lastキャッチされていない最後の例外を返します。これは、静的メソッドです。
rethrow既にキャッチされている例外を発行し直します。
throw例外を発行します。
throwAsCaller例外を発行しますが、stack フィールドの現在のスタック フレームは省きます。