题目
编写程序,演示科学计算工程函数中通用的参数防错模式:遇到不可恢复的致命参数异常时触发 <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
尝试计算负数矩阵对数...
成功捕获主动抛出的异常: [数学定义域错误:当前函数不允许输入非正数!]
程序未崩溃,平稳降级恢复。