gpt4 book ai didi

matlab - 在 MATLAB 中将警告转换为错误

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:43 24 4
gpt4 key购买 nike

在我的一些函数中,我想将一些警告转换为错误。例如,如果我想在 str2func 产生 MATLAB:str2func:invalidFunctionName 警告时抛出错误,我会执行以下操作:

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

如果我知道一个特定的代码块可以给出一小组警告,这就可以正常工作。然而,它很冗长,可能无法扩展到更大的代码块。有更好的方法吗?理想情况下,我想要一个可以将某些警告转换为整个 block 中的错误的函数。它将允许我将示例修改为:

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

最佳答案

另一种方法是重载警告本身。请参阅下面的 warning.m 和 warning2error.m 的实现。我从中看到的最大副作用是您会在堆栈上看到一个额外的“warning.m”,用于显示所有警告消息。不确定是否有解决办法。此外,您需要禁用 MATLAB:dispatcher:nameConflict 警告,因为我们正在重载内置函数。

编辑:刚刚在 matlabcentral.com 上注意到一个未记录的使用内置警告来完成此操作: http://www.mathworks.com/matlabcentral/newsreader/view_thread/158768 http://undocumentedmatlab.com/blog/trapping-warnings-efficiently/

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

从命令行使用

warning2error('add','MATLAB:str2func:invalidFunctionName')

警告.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

关于matlab - 在 MATLAB 中将警告转换为错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com