sequential try catch end block for matlab

前端 未结 2 1920
北海茫月
北海茫月 2020-12-21 03:45

I\'d like to run several lines of code, but I\'m unsure if any line will throw an error. If an error occurs however, I\'d like the script to ignore that line and continue on

相关标签:
2条回答
  • 2020-12-21 03:50

    One option is to put each section of code in a function and iterate over a cell array of the function handles. Here's an example with a list of anonymous functions:

    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
    

    And here's the output this generates, showing that functions are still evaluated even after one throws an error:

    1
    2
    Error with function 3.
    4
    

    The above example works for the case when you have individual lines of code you want to evaluate sequentially, but you can't fit multiple lines into an anonymous function. In this case, I would go with nested functions if they have to access variables in the larger workspace or local functions if they can operate independently. Here's an example with nested functions:

    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
    

    And the output:

    3
    Error with function 2.
    4
    
    0 讨论(0)
  • 2020-12-21 04:08

    A simpler approach involves reading the script file line by line and evaluating each line in turn. This assumes that the script you want to run does not include any multi-line statements (such as e.g. a for with the end on a different line, or a statement broken onto multiple lines using ...). This is a strong limitation, as it is common to e.g. initialize a matrix using multiple lines of text.

    This is the function:

    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
    

    It does exactly as I described above: it reads in a line, then uses evalin to evaluate that line in the caller's workspace. Any variable created is created in the caller's workspace. Any variable used is taken from the caller's workspace.

    For example, I create the file testscript.m with the following contents:

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

    Next, at the MATLAB command prompt:

    >> 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                  
    

    The variable A and D were created. If I define 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                  
    

    With a variable C defined, the script runs without error, and defines B also.

    0 讨论(0)
提交回复
热议问题