主要内容

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

例外への応答

概要

马铃薯®ソフトウェアの既定の设定では,例外がスローされると现在実行中のプログラムを停止します。ただし,プログラムで例外をキャッチすると,误りに关する情报を收集し,适切な方法で特定の状况に対处できます。このためには,试着抓ステートメントが必要です。

try / catch语句ステートメント

期待どおりの结果が生じない可能性のあるコードがステートメントに含まれる场合は,これらのステートメントを试着抓ブロックに入れます。エラーが発生した场合はキャッチされ,适切に处理されます。

试着抓ステートメントは,次の疑似コードにようになり,次の2つの部分で构成されます。

  • 尝试抓住ステートメント间のすべての行を含む,尝试ブロック。

  • 抓住结尾ステートメント间のすべての行を含む,抓住ブロック。

试图执行一个...或多个操作的抓我检查异常对象错误信息ME试图找出什么地方出了错要么试图恢复或清理并终止B端方案继续

このプログラムは、尝试ブロックのステートメントを実行します。エラーが见つかると,尝试ブロックの残りのステートメントをスキップし,抓住ブロックの始め(上の一种の位置)にジャンプします。尝试ブロックのすべての演算が成功すると,抓住ブロックが完全にスキップされ,结尾ステートメントに続く最初の行(点B.)に进みます。

尝试抓住结尾コマンドと、尝试抓住ブロックのコードは,别の行に指定することを推奨します。同じ行にこれらのコンポーネントのいずれかを组み合わせる场合は,以下のようにコンマで区切ります。

尝试,冲浪,赶上我,ME.stack,最终ANS =文件:'草根\工具箱\ MATLAB \ graph3d \ surf.m”名称: '冲浪' 行:49

メモ

尝试または抓住ブロック内では,入れ子关数を定义することはできません。

尝试ブロック

実行时に,コードは尝试ブロックに入り,通常のプログラムの一部と同様に各ステートメントが実行されます。エラーが见つからなかった场合,MATLABでは抓住ブロックが完全にスキップされ,结尾ステートメントに従って実行を続けます。尝试ステートメントのいずれかにエラーがあると、そのブロックの残りのステートメントは実行せずに、すぐに尝试ブロックを终了し,抓住ブロックに入ります。

抓住ブロック

抓住コマンドは,抓住ブロックの开始をマークし,例外の原因についての情报を含むデータ构造へのアクセスを提供します。これは,以前の疑似コードの変数として表示されます。MExceptionオブジェクトです。例外が発生すると,MATLABはMExceptionオブジェクトを作成し,そのエラーを处理する抓住ステートメントに含めてオブジェクトを返します。

抓住ステートメントでは引数を指定する必要はありません。MExceptionオブジェクトで提供される情报やメソッドが必要でない场合は,抓住キーワードのみを指定します。

MExceptionオブジェクトは,エラーのあるプログラムの内部コードによって作成されます。このオブジェクトは,エラーに关する情报を含むプロパティをもちます。この情报は,何が起こったかを特定したり,対处方法を决定する际に役立ちます。MExceptionオブジェクトではメソッドへのアクセスも提供され,例外に応答できるようになります。

抓住ブロックに入ると,MATLABではステートメントが顺番に実行されます。これらのステートメントでは,以下を试みることができます。

  • エラーの解决

  • エラーに関する詳細情報の収集

  • MExceptionオブジェクトの情报に基づいた,适切な応答

  • エラーの発生したコードの残した环境のクリーンアップ

抓住ブロックは,多くの场合,重演コマンドで终わります。重演では,例外が初めにスローされたときの状态に呼び出しスタックの情报を保ち,MATLABで现在の关数を终了させます。この关数が最上位にある场合,つまり,他の关数によって呼び出されなかった场合は,プログラムが终了します。エラーの発生した关数が别の关数で呼び出された场合は,呼び出し侧の关数に戻ります。プログラムは実行を続け,上位レベルの关数に戻ります。ただし,呼び出しのいずれかが上位レベルの尝试ブロック内で行われた場合は例外で、この場合は対応する 接住ブロックが実行されます。

例外の処理方法についての提案

以下の例では,イメージファイルの内容を読み込みます。これには详细なエラー处理が含まれており,エラーに対して実行できる提案アクションの一部について说明します。

イメージを読み取る关数がエラーをスローおよびキャッチする方法にはいくつかあります。

  • 最初の如果ステートメントは,关数が入力引数を指定して呼び出されているかどうかをチェックします。入力引数が指定されていない场合,プログラムはエラーをスローし,エラーを修正するための入力引数を提案します。

  • 尝试ブロックでは,ファイルを开いて読み取りが试行されます。ファイルを开けなかった场合や,読み込みに失败した场合は,プログラムで结果の例外がキャッチされ,MExceptionオブジェクトが変数ME1に保存されます。

  • 抓住ブロックでは,指定されたファイルが见つからなかったかどうかのチェックが行われます。见つからなかった场合は,ファイル名拡张子の一般的なバリエーション(たとえば,jpgの代わりにJPEG)を使用して,操作が再试行されます。これは,元の试着抓に入れ子にされた试着抓ステートメントを使用して行われます。

函数d_in=read_image(文件名)%检查输入参数的数量。如果nargin<1 me=MException('MATLAB:notEnoughInputs','notEnoughInputs'不够输入参数');aac=matlab.lang.correction.AppendArgumentsCorrection('image.png');me=me.addCorrection(aac);扔(我);end%尝试读取文件并捕获异常(如果出现)。尝试fid=fopen(文件名为'r');d_in=fread(fid);catch ME1%获取错误标识符的最后一段。idSegLast=regexp(ME1.identifier,,(?<=:)\w+$,'match');%读取是否因为找不到文件而失败?如果strcmp(idSegLast,'invalidId')&&~存在(文件名,'file')%Yes。尝试修改文件扩展名。切换ext case'.jpg''%Change jpg to jpeg filename=strep(filename,.jpg',.jpeg');大小写“.jpeg%”将jpeg更改为jpg filename=strep(文件名“.jpeg”,“.jpg”);case'.tif'%将tif更改为tiff filename=strep(文件名'.tif',.tiff');案例'.tiff'%将tiff更改为tif filename=strep(文件名'.tiff',.tif');否则fprintf('找不到文件%s\n',文件名);回流(ME1);结束%重试,修改文件名。尝试fid=fopen(文件名为'r');d_in=fread(fid);catch ME2 fprintf('无法访问文件%s\n',文件名);ME2=添加原因(ME2,ME1);回流(ME2)端

この例では,次のような,例外への応答で実行できる操作をいくつか说明します。

  • MExceptionオブジェクトの标识符フィールドを,エラーの考えられる原因と比较。この场合,关数は识别子がファイルが见つからなかったこととを示す'InvalidFid'で终了しているかどうかをチェックします。

  • 入れ子になっている试着抓ステートメントを使用して,改善された入力で操作を再试行。この场合,关数はファイル名拡张子の既知のさまざまなバリエーションを使用して,开く操作と読み取る操作を再试行します。

  • 适切なメッセージを表示。

  • 最初のMExceptionオブジェクトを2番目の原因フィールドに追加

  • 推奨される修正をMExceptionオブジェクトに追加。

  • 例外を再スロー。これによりプログラムの実行が停止し,エラーメッセージが表示されます。

エラーによって引き起こされた望ましくない结果もクリーンアップすることをお勧めします。たとえば,エラーの発生后に开いたままになっている図を闭じます。