主要内容

响应异常

概述

MATLAB®默认情况下,当抛出异常时,软件将终止当前正在运行的程序。但是,如果在程序中捕获异常,则可以捕获关于哪里出了问题的信息,并以适合于特定条件的方式处理这种情况。这需要一个尝试/抓住声明。

try/catch语句

当您的代码中有可能生成不希望的结果的语句时,请将这些语句放入尝试/抓住捕捉任何错误并适当处理它们的块。

A尝试/抓住语句类似于以下伪代码。它由两部分组成:

  • A试一试对象之间的所有行试一试抓住语句。

  • A抓住块,其中包括抓住结束语句。

尝试执行一个…或多个操作捕获我检查异常对象中的错误信息尝试找出错误原因尝试恢复,或清理并中止结束B程序继续

的语句执行试一试街区。如果遇到错误,它将跳过试一试阻止并跳到事件的开始抓住块(这里显示为点A).的所有操作试一试块成功,则执行跳过抓住完全阻塞,然后到后面的第一行结束声明(要点)B).

指定试一试,抓住,结束的命令和代码试一试抓住建议将块放在单独的行上。如果你将这些组件组合在同一行,请用逗号分隔它们:

try,surf,catch ME,ME.stack,end ans=file:'matlabroot\工具箱\matlab\graph3d\surf.m'名称:'surf'行:49

不能在内部定义嵌套函数试一试抓住街区。

试块

执行时,代码将进入试一试块并执行每个语句,就像它是常规程序的一部分一样。如果没有遇到错误,MATLAB将跳过抓住完全阻塞,并在结束声明。如果试一试语句失败,MATLAB立即退出试一试块,使该块中的所有剩余语句保持未执行状态,并输入抓住街区。

Catch块的

这个抓住命令的开始抓住阻止并提供对数据结构的访问,该数据结构包含有关导致异常的原因的信息。这显示为变量在前面的伪代码中。是一个MException对象。当异常发生时,MATLAB创建一个MException对象并将其返回抓住处理该错误的语句。

您不需要指定任何带有抓住声明。如果您不需要任何信息或方法提供MException对象,只需指定抓住只有关键字。

这个MException对象由失败的程序中的内部代码构造。对象的属性包含关于错误的信息,这些信息有助于确定发生了什么以及如何继续。这个MException对象还提供对方法的访问,这些方法使您能够响应异常。

进入抓住块,MATLAB按顺序执行语句。这些语句可以尝试

  • 尝试解决此错误。

  • 捕获有关错误的更多信息。

  • 打开在MException反对并做出适当的回应。

  • 清理失败代码留下的环境。

这个抓住块通常以重新抛出指挥部。这个重新抛出使MATLAB退出当前函数,保持调用堆栈信息与第一次抛出异常时的状态相同。如果此函数处于最高级别,即未被其他函数调用,则程序终止。如果失败的函数被另一个函数调用,它将返回到该函数。程序执行继续返回到更高级别的函数,除非这些调用中的任何一个是在更高级别的函数中进行的试一试块,在这种情况下,程序执行相应的catch块。

处理异常的建议

下面的示例读取图像文件的内容。它包括详细的错误处理,并演示了一些建议的操作,您可以采取这些操作来响应错误。

图像读取函数以多种方式抛出和捕获错误。

  • 第一如果语句检查是否使用输入参数调用函数。如果未指定输入参数,程序将抛出错误并建议输入参数以更正错误。

  • 这个试一试块尝试打开并读取文件。如果打开或读取失败,程序将捕获结果异常并保存MException变量中的对象组织.

  • 这个抓住块检查以查看是否找不到指定的文件。如果是,程序允许文件扩展名的常见变化(例如。,jpeg而不是jpg)已使用,方法是使用修改的扩展重试该操作。这是使用尝试/抓住嵌套在原始语句中的语句尝试/抓住.

function d_in = read_image(filename) %检查输入参数的数量。如果nargin < 1 me = MException('MATLAB:notEnoughInputs','Not enough input arguments.');aac = matlab.lang.correction.AppendArgumentsCorrection(“image.png”);我= me.addCorrection (aac);把(我);尝试读取文件并捕捉异常,如果它出现。Try fid = fopen(filename,'r');d_in =从文件中读(fid);获取错误标识符的最后一段。idSegLast = regexp (ME1.identifier‘(? < =:)\ w + $”、“匹配”); % Did the read fail because the file could not be found? if strcmp(idSegLast,'InvalidFid') && ... ~exist(filename,'file') % Yes. Try modifying the filename extension. switch ext case '.jpg' % Change jpg to jpeg filename = strrep(filename,'.jpg','.jpeg'); case '.jpeg' % Change jpeg to jpg filename = strrep(filename,'.jpeg','.jpg'); case '.tif' % Change tif to tiff filename = strrep(filename,'.tif','.tiff'); case '.tiff' % Change tiff to tif filename = strrep(filename,'.tiff','.tif'); otherwise fprintf('File %s not found\n',filename); rethrow(ME1); end % Try again, with modified filenames. try fid = fopen(filename,'r'); d_in = fread(fid); catch ME2 fprintf('Unable to access file %s\n',filename); ME2 = addCause(ME2,ME1); rethrow(ME2) end end end

此示例说明了您可以对异常作出响应的一些操作。

  • 比较标识符领域MException对象以查找错误的可能原因。在这种情况下,函数检查标识符是否以“残疾人”,表示找不到文件。

  • 使用嵌套的尝试/抓住语句重试使用改进的输入的操作。在这种情况下,函数使用已知的文件名扩展名变体来重试打开和读取操作。

  • 显示适当的消息。

  • 加上第一个MException反对导致第二个字段。

  • 将建议的更正添加到MException对象。

  • 重新抛出异常。这将停止程序执行并显示错误消息。

清除错误的任何不需要的结果也是可取的。例如,关闭错误发生后仍然打开的数字。