Matlab:如何捕捉警告

l5tcr1uw  于 2023-10-23  发布在  Matlab
关注(0)|答案(3)|浏览(175)

我在MATLAB中运行一些数据处理工作,求解器使用了SLASH运算符。有时候,我会收到这样的警告:

Warning: Rank deficient, rank = 1390, tol = 1.335195e-010.
Warning: Rank deficient, rank = 1386, tol = 1.333217e-010.

我想听听这些警告。我试图将警告转换为错误,然后按照标题“捕获警告”下的描述捕获它:http://undocumentedmatlab.com/blog/trapping-warnings-efficiently在示例中,以下字符串用于将warning转换为error:

s = warning('error', 'MATLAB:DELETE:Permission');

但是,我不确定我的情况下使用什么字符串。我尝试使用

s = warning('error', 'Warning: Rank deficient’);

但是,它没有工作。如果你能帮忙的话,我将不胜感激。
问候,DK

mfuanj7w

mfuanj7w1#

您需要指定警告 * 标识符 *,而不是警告文本。您可以使用lastwarn的双输出形式找到标识符:

[msgstr, msgid] = lastwarn

在你的例子中,我认为你想要的标识符是'MATLAB:rankDeficientMatrix'

igetnqfo

igetnqfo2#

您可以尝试使用lastwarn作为替代方案。除法之后,调用它并将其与strcmp和通常的警告消息进行比较,如果是您想要的,您可以手动抛出error所需的错误。
正如你所建议的:你可以重置lastwarn抛出一个空的警告warning('')

ig9co6j1

ig9co6j13#

下面的代码紧密地实现了Python的

with warnings.catch_warnings(record=True) as ws:
    fn_out = fn()
    warn_out = ''
    for w in ws:
        if 'blah' in w.message:
            warn_out = w.message

它执行fn()两次,确保警告状态被恢复,并可选地抑制其打印语句(例如,disp)。要求warning()语句使用警告ID,即warning('a:b', msg)语法。

示例

fn = @()delete('beep');  % target function
warn_id = 'MATLAB:DELETE:FileNotFound';  % target warning ID

o = execute_and_catch_warning(fn, warn_id);  % application
[fn_out, warn_out] = o{:}  % fetch function output and warning message
fn_out =

   NaN

warn_out =

    'File 'beep' not found.'

分步骤

1.存储warning状态以便以后恢复
1.将warning('off', warn_id)设置为允许执行而不显示警告
1.执行fn()以获取其输出
1.设置warning('error', warn_id),以便下次执行fn()时触发警告,但不打印它
1.再次执行fn()
1.通过e.messagecatch e)消除警告
1.恢复警告状态
1.以out = {fn_out, warn_out}的形式返回fn()的输出和警告消息
更多的事情发生了(例如)。try-catch)但这是想法。
fn_out可以是可选的(例如,添加另一个arg,并使用if get_outputs Package 代码)。

代码

function [fn_out, warn_out] = execute_and_catch_warning(fn, warn_id)  %#ok<INUSD>
    s = warning;
    warning('off', warn_id);
    try
        % first try assuming `fn()` has an output
        [~, fn_out] = fn();
    catch
        % this is in case `fn()` has no output
        warning(s);  % restore prematurely in case `fn()` errors again
        fn();
        fn_out = nan;
    end

    warning('error', warn_id);
    try
        fn();  % suppress print statements
        warn_out = "";
    catch e
        warn_out = e.message;
    end
    warning(s)  % restore warning state
end

抑制打印:将fn()替换为evalc('fn()')。* (通常不鼓励使用eval,但docs中的任何内容都不适用)。*

相关问题