2012-02-24 35 views
8

Trong một số chức năng của tôi, tôi muốn chuyển đổi một số cảnh báo thành lỗi. Ví dụ, nếu tôi muốn ném ra một lỗi khi str2func mang lại một cảnh báo MATLAB:str2func:invalidFunctionName, tôi sẽ làm như sau:chuyển đổi cảnh báo thành lỗi trong MATLAB

invalid_func_id = 'MATLAB:str2func:invalidFunctionName'; 
%hide warning of interest 
warning('off', invalid_func_id); 
%this might yield the warning of interest 
predicate_func_try = str2func(predicate_func); 
[~, warn_id] = lastwarn; 
assert(~strcmp(warn_id, invalid_func_id)... 
    , 'MyFunc:InvalidFunctionName'... 
    , 'The predicate function %s does not have a valid name'... 
    , predicate_func... 
    ); 
warning on all 

này hoạt động tốt nếu tôi biết rằng một khối mã cụ thể cho một nhóm nhỏ các cảnh báo. Tuy nhiên nó là tiết và có lẽ không quy mô để khối mã lớn hơn. Có cách nào tốt hơn để làm điều này? Lý tưởng nhất là tôi sẽ muốn có một chức năng mà có thể biến một số cảnh báo lỗi trong một khối toàn bộ. Nó sẽ cho phép tôi sửa đổi ví dụ của mình thành:

warnings2errors('MATLAB:str2func:invalidFunctionName'); 
predicate_func_try = str2func(predicate_func); 
warnings2errors('off'); 
+3

Theo chủ đề này - http://www.mathworks.com/matlabcentral/newsreader/view_thread/158768 - theo cách của bạn là người duy nhất. –

Trả lời

1

Tôi không biết cách làm sạch chính xác những gì bạn muốn. Tùy thuộc vào lý do của bạn muốn biến sai sót vào cảnh báo, bạn có thể nhận được bởi với:

dbstop if warning 

hoặc

dbstop if warning MyFunc:InvalidFunctionName 

Bạn cũng có thể nhìn vào warning on stacktrace, để có được infomrat6ion thêm về cảnh báo như họ xuất hiện.

Nếu bạn cần một thông báo lỗi thực sự (không chỉ là một cách để đột nhập vào trình gỡ rối) thì tôi thực sự khá ấn tượng với phương pháp bạn đưa vào câu hỏi.

0

Tôi đã tìm ra cách để khái quát điều này một chút. Nó hoạt động theo cách sau (tương tự như tictoc):

warn_ids = setwarnings2errors('MATLAB:str2func:invalidFunctionName'); 
predicate_func_try = str2func(predicate_func); 
getwarnings2errors(warn_ids); 

giữa setwarnings2errorsgetwarnings2errors, tất cả các cảnh báo thiết lập sẽ ném ra một lỗi nếu họ là những cảnh báo cuối cùng ném. Do đó nó không nên được sử dụng trong các khối lớn, nơi có nhiều cảnh báo khác nhau có thể xảy ra. Tôi thực hiện các chức năng theo cách sau:

setwarnings2errors:

function warning_ids = setwarnings2errors(varargin) 
warning_ids = cell(nargin, 1); 
for x_ = 1:nargin 
    local_arg = varargin{x_}; 
    assert(ischar(local_arg)); 
    evalin('caller', sprintf('warning off %s', local_arg)); 
    warning_ids{x_} = local_arg; 
end 
end 

getwarnings2errors:

function getwarnings2errors(warning_ids) 
[lastwarn_str, lastwarn_id] = evalin('caller', 'lastwarn'); 
num_warns = numel(warning_ids); 
try 
    for x_ = 1:num_warns 
     local_warn = warning_ids{x_}; 
     assert(~strcmp(local_warn, lastwarn_id)... 
      , lastwarn_id... 
      , lastwarn_str... 
      ); 
    end 
catch m_e 
    evalin('caller', 'warning on all'); 
    throwAsCaller(m_e); 
end 
evalin('caller', 'warning on all'); 
end 
5

phương pháp khác là quá tải cảnh báo riêng của mình. Xem triển khai cảnh báo.m và warning2error.m bên dưới. Tác dụng phụ lớn nhất mà tôi thấy từ điều này là bạn sẽ thấy thêm "warning.m" được hiển thị trên ngăn xếp cho tất cả các thông báo cảnh báo. Không chắc chắn nếu có một cách xung quanh đó. Ngoài ra, bạn cần vô hiệu hóa cảnh báo MATLAB: dispatcher: nameConflict vì chúng tôi đang quá tải một nội trang dựng sẵn.

EDIT: Chỉ cần nhận thấy trên matlabcentral.com việc sử dụng không có giấy tờ của cảnh báo được xây dựng trong đó hoàn thành điều này: http://www.mathworks.com/matlabcentral/newsreader/view_thread/158768 http://undocumentedmatlab.com/blog/trapping-warnings-efficiently/

>> warning('error','MATLAB:str2func:invalidFunctionName') 

SỬ DỤNG TỪ COMMAND LINE

warning2error ('thêm ',' MATLAB: str2func: invalidFunctionName ')

Cảnh báo.m:

% Overload of warning.m to enable conversion of certain warnings to errors 
% via warning2error.m 
% 
% Will want to disable warning "MATLAB:dispatcher:nameConflict" via command 
% warning('off','MATLAB:dispatcher:nameConflict'); 
% 
% Jesse Hopkins 
% Oct. 2 2012 

function varargout = warning(varargin) 
    %check for component:mnemonic syntax 
    if nargin >= 2 && ischar(varargin{1}) && any(regexp(varargin{1},'^(\w+:\w+){1,}$','start','once')) 
     %we've captured <component>[:<component>]:<mnemonic>syntax 

     %check if this is in the list 
     if warning2error('query',varargin{1}) 
      %YES, convert to error 
      ME = MException(varargin{1},varargin{2:end}); 
      ME = ME.addCause(MException('Warning2Error:ConvertedWarning','Converted warning "%s" to error becuase it was registered via warning2error.m.',varargin{1})); 
      ME.throwAsCaller; 
     end 
    end 

    %pass through to built-in warning 
    varargout{1:nargout} = builtin('warning',varargin{:}); 
end 

Warning2Error.m:

%warning2error.m 
%USAGE: 
% Add warnings to convert to errors. 
% warning2error('add','<component>[:<component>]:<mnemonic>',... 
% 
% Remove warnings to convert to errors 
% warning2error('remove','<component>[:<component>]:<mnemonic>',... 
% 
% Query warnings to convert to errors 
% tf = warning2error('query','<component>[:<component>]:<mnemonic>') 
% 
% Get entire list of warnings converted to errors 
% list = warning2error('get') 
% 
% Jesse Hopkins 
% Oct 2 2012 

function varargout = warning2error(op,varargin) 
    persistent list; 
    if isempty(list) 
     list = {}; 
    end 
    varargout={}; 

    switch lower(op) 
     case 'add' 
      list = unique([list(:);varargin(:)]); 
     case 'remove' 
      for i = 1:length(varargin) 
       [tf idx] = ismember(varargin{i},list); 
       allidx = 1:length(list); 
       newidx = setdiff(allidx,idx); 
       list = list(newidx); 
      end 
     case 'clear' 
      list = {}; 
     case 'get' 
      varargout{1} = list; 
     case 'query' 
      out = false(1,length(varargin)); 
      for i = 1:length(varargin) 
       out(i) = ismember(varargin{1},list); 
      end 
      varargout{1} = out; 
    end 
end 
Các vấn đề liên quan