Matlab 优化异常处理:fprintf的妙用
总结
优化Matlab try…catch.end 的报错提示,使其既能简单显示报错原因,需要时也可以查看具体报错位置。
Matlab 如果给语句加了 try…catch.end,可以对异常错误进行处理,使得程序在遇到错误时不会立即停止,并可以修改输出把原本的代码报错变为用户能理解的错误原因。
比如下面这段代码,运行之后如果报错,就会提示错误原因
1 2 3 4 5 6 7 8 9
| try a = 1:5; b = 6; c = a(6); catch ME fprintf(2,'%s\n', ME.message); end
|
但是有一个问题——就是不会显示到底哪一行出错了,不方便调试查看
其实 matlab 的命令行不仅仅可以输出纯文字,还可以输出超链接,这个超链接除了可以跳转网页,还可以执行命令,比如将超链接的 href 设置为 matlab:clc
点击就可以清屏,设置为 matlab:fprintf
点击就可以输出文字!
所以我们可以把代码错误的具体位置信息封装起来,需要的时候点击输出到控制台!这个报错的代码行号是可以直接点击跳转的!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| try a = 1:5; b = 6; c = a(6); catch ME fprintf(2,'%s\n', ME.message); errorReport = ME.getReport('extended'); errorReport = matlab.net.base64encode(unicode2native(errorReport, 'UTF-8')); errLink = ['<a href ="matlab:fprintf(2,''\n%s\n'', '... 'native2unicode(matlab.net.base64decode(''' errorReport '''),''UTF-8''));">'... 'View detailed error information</a>.']; clcLink = '<a href ="matlab:clc">Clear command window</a>.'; fprintf(2,'%s %s\n' ,errLink,clcLink); end
|
包装为函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| try a = 1:5; b = 6; c = a(6); catch ME fprintf(2,'%s\n', ME.message); reportError(ME); end
function reportError(ME) errorReport = ME.getReport('extended'); errorReport = matlab.net.base64encode(unicode2native(errorReport, 'UTF-8')); errLink = ['<a href ="matlab:fprintf(2,''\n%s\n'', '... 'native2unicode(matlab.net.base64decode(''' errorReport '''),''UTF-8''));">'... 'View detailed error information</a>.']; clcLink = '<a href ="matlab:clc">Clear command window</a>.'; fprintf(2,'%s %s\n' ,errLink,clcLink); end
|