当前位置: 首页 > 知识库问答 >
问题:

matlab的顺序尝试捕获结束块

龚同
2023-03-14

我想运行几行代码,但我不确定是否有任何行会抛出错误。但是如果发生错误,我希望脚本忽略该行并继续。

一种选择是使用<code>try-catch-end

TL;TR:除了为下面示例代码中的每一行编写<code>try-catch-end

示例代码:

try
  disp('1st line');
  disp('2nd line');
  PRODUCE_ERROR;  %throws an error, variable/function does not exist
  disp('3rd line'); %%%%%
  disp('4th line'); % these lines I would like to keep executing
  disp('5th line'); %%%%%
catch
  disp('something unexpected happened');
end

输出:

1st line
2nd line
something unexpected happened

首选输出:

1st line
2nd line
something unexpected happened
3rd line
4th line
5th line

相关:为什么我不应该在“try”-“catch”中包装每个块?

共有2个答案

慕容齐智
2023-03-14

更简单的方法包括逐行读取脚本文件并依次评估每行。这假设您要运行的脚本不包含任何多行语句(例如,结尾位于另一行上的 for,或者使用 ...将语句拆分为多行)。这是一个很强的限制,因为通常使用多行文本初始化矩阵。

这是函数:

function execute_script(fname)
fid = fopen(fname,'rt');
n = 0;
while ~feof(fid)
   cmd = fgetl(fid);
   n = n+1;
   if ~isempty(cmd)
      try
         evalin('caller',cmd);
      catch exception
         disp(['Error occurred executing line number ',num2str(n),': ',exception.message]);
      end
   end
end

它与我上面描述的完全一样:它读入一行,然后使用<code>evalin

例如,我用以下内容创建了文件< code>testscript.m:

A = 1;
B = 2+C; % This line needs a variable not defined in the script!
D = 5;

接下来,在MATLAB命令提示符下:

>> execute_script('testscript.m')
Error occurred executing line number 2: Undefined function or variable 'C'.
>> whos
  Name      Size            Bytes  Class         Attributes

  A         1x1                 8  double                  
  D         1x1                 8  double                  

变量AD已创建。如果我定义C

>> C=0;
>> execute_script('testscript.m')
>> whos
  Name      Size            Bytes  Class         Attributes

  A         1x1                 8  double                  
  B         1x1                 8  double                  
  C         1x1                 8  double                  
  D         1x1                 8  double                  

定义了变量C后,脚本运行时不会出错,还定义了B

欧阳勇军
2023-03-14

一种选择是将每一段代码放在一个函数中,并遍历函数句柄的单元格数组。这是一个包含匿名函数列表的示例:

fcnList = {@() disp('1'); ...
           @() disp('2'); ...
           @() error(); ...    % Third function throws an error
           @() disp('4')};

for fcnIndex = 1:numel(fcnList)
  try
    fcnList{fcnIndex}();  % Evaluate each function
  catch
    fprintf('Error with function %d.\n', fcnIndex);  % Display when an error happens
  end
end

这是它生成的输出,表明即使在抛出错误后函数仍会被评估:

1
2
Error with function 3.
4

上面的示例适用于您想要按顺序计算单独的代码行,但您不能将多行放入匿名函数中的情况。在这种情况下,如果嵌套函数必须访问更大工作区中的变量,或者如果它们可以独立运行,我会使用嵌套函数。这是一个嵌套函数的示例:

function fcn1
  b = a+1;     % Increments a
  fprintf('%d\n', b);
end
function fcn2
  error();     % Errors
end
function fcn3
  b = a.^2;    % Squares a
  fprintf('%d\n', b);
end

a = 2;
fcnList = {@fcn1 @fcn2 @fcn3};

for fcnIndex = 1:numel(fcnList)
  try
    fcnList{fcnIndex}();
  catch
    fprintf('Error with function %d.\n', fcnIndex);
  end
end

并且输出:

3
Error with function 2.
4
 类似资料:
  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 在此Java代码中, 我期望的输出是 但是有时候我得到这个预期的输出,而在其他时候我得到以下输出: 有时甚至是这个输出: 以及我是否获得第一,第二或第三输出似乎在每次执行期间都是随机发生的。我发现此POST显然在谈论相同的问题,但我仍然不明白为什么有时会得到输出1、2或3。如果我正确理解了这段代码,那么输出1应该是我每次得到的(发生异常) )。如何确保始终如一地获得输出1,或者能够确定

  • 我有以下代码(参考下文)以ASC顺序显示来自mysql的结果 但是我得到了一个错误:“警告:mysqli_fetch_array()期望参数1是mysqli_result,布尔值在”中给出,它指向第38行,第38行是“while($row=mysqli_fetch_array($result))” 正如您所看到的,我正试图按ASC顺序按键获取结果,键行包含0 1 2 3 4这样的数字,因此结果应按

  • 问题内容: 我只是在学习Java异常处理和Java。我制作了一个Swing GUI,用户将在两个字段中输入整数,然后单击带有算术函数的单选按钮,答案将出现在第三个文本字段中。我想包含一个try / catch块,以在用户将前两个字段之一留为空白或输入除整数以外的内容时捕获异常,以及如果用户尝试将其除以零则输入第二个catch。该窗体可以正常工作,但是不会捕获错误,只能返回堆栈跟踪并使程序崩溃。我感

  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall