题目

编写程序,演示科学计算工程函数中通用的参数防错模式:遇到不可恢复的致命参数异常时触发 <code>error()</code> 立即阻断;遇到次要潜在风险时触发 <code>warning()</code> 发出告警并做兜底回退。

输入格式:无需外部输入。

输出格式:演示 warning 的发出与错误捕获 try-catch。

数据范围与约定:异常与告警控制。

思路与算法

1. warning 与 error 的分工
warning("message") 输出告警信息但不会中断程序执行流;error("message") 立即抛出致命异常并中断整个调用栈。

2. try-catch 异常捕获
在稳健系统中,可使用 try ... catch err ... end 捕获 error 并解析错误结构体 err.message,实现优雅降级。

3. 工程防御准则
严禁对不合规数据假装看不见。早期显式报错比后期产出脏数据更容易定位调试。

完整程序

% Octave / MATLAB 第48题:error 与 warning 拦截机制

% 1. 触发 warning 告警示例 (程序继续运行)
sample_rate = -100;
if sample_rate <= 0
    fprintf("warning: 采样率不可为负,已自动修正回退为默认值 1000 Hz。\n");
    sample_rate = 1000;
end
fprintf("当前使用采样率: %d Hz\n", sample_rate);

% 2. 使用 try-catch 捕获 error 报错示例
try
    fprintf("\n尝试计算负数矩阵对数...\n");
    val = -5;
    if val < 0
        error("数学定义域错误:当前函数不允许输入非正数!");
    end
catch err
    fprintf("成功捕获主动抛出的异常: [%s]\n", err.message);
    fprintf("程序未崩溃,平稳降级恢复。\n");
end

运行示例

输出:

warning: 采样率不可为负,已自动修正回退为默认值 1000 Hz。
当前使用采样率: 1000 Hz

尝试计算负数矩阵对数...
成功捕获主动抛出的异常: [数学定义域错误:当前函数不允许输入非正数!]
程序未崩溃,平稳降级恢复。