【IDL】批处理遇到错误时处理方法 |
您所在的位置:网站首页 › 批处理跳过错误 › 【IDL】批处理遇到错误时处理方法 |
很多童鞋喜欢用IDL进行批处理,而文件输入列表一般都采用file_search函数进行自动搜索(此函数详见 https://www.cnblogs.com/enviidl/p/16356480.html)。但是在某一个文件读写出错时,程序就会停止运行,而无法处理之后的数据。其实,在IDL中有完善的错误处理机制,具体可参考帮助中的Routines (by topic) > Error Handling章节。 这里使用Catch来实现错误处理,主要功能为: 遇到文件读取错误时,跳过本文件,继续处理后续文件; 可在控制台(或日志文件)中输出错误状态和信息。为了模拟数据读取错误,这里新建了5个文本文件,其中1、2、4、5均为4列2行的整型数组,而3号文件为字符串,所以在读取时会遇到错误。 完整代码如下: PRO testCatch COMPILE_OPT idl2 ;输入搜索路径,并搜索txt文件 path=FILE_DIRNAME(ROUTINE_FILEPATH('testCatch'))+$ PATH_SEP()+'TestFiles' files=FILE_SEARCH(path, '*.txt', COUNT=count) IF count EQ 0 THEN RETURN ;开始批处理 FOR i=0,count-1 DO BEGIN ;进行错误捕捉 CATCH, errorStatus IF (errorStatus NE 0) THEN BEGIN CATCH, /CANCEL ;控制台输出错误消息 PRINT, '读取文件出错:', !ERROR_STATE.MSG ;释放出错文件 FREE_LUN, lun ;跳过本次循环 CONTINUE ENDIF ;数据读取,因为data初始化为整型数组,在读取file3.txt时会出错 OPENR, lun, files[i], /GET_LUN data = INTARR(4,2) READF, lun, data FREE_LUN, lun ;读取成功时,在控制台打印消息 PRINT, '读取文件成功:', files[i] ENDFOR END 注:代码中的输入路径为PRO文件所在路径的"TestCatch"文件夹。源码编码为GB2312。 控制台输出信息如下: 读取文件成功:D:\IDLWorkspace84\Default\TestCatch\file1.txt 读取文件成功:D:\IDLWorkspace84\Default\TestCatch\file2.txt 读取文件出错:READF: Input conversion error. Unit: 123, File: D:\IDLWorkspace84\Default\TestCatch\file3.txt 读取文件成功:D:\IDLWorkspace84\Default\TestCatch\file4.txt 读取文件成功:D:\IDLWorkspace84\Default\TestCatch\file5.txt
测试代码下载地址:http://pan.baidu.com/s/1o6yWHBk 将下载的ZIP压缩包解压即可,保证PRO文件与"TestFiles"文件夹在同一路径即可。
除此之外,还有另外一种处理错误的方法。比如在使用ENVI 5.x新增的面向对象方法时,可以使用ERROR关键字来接收出错信息,从而Continue跳过循环。调试如下: IDL> ;启动ENVI IDL> e=envi() ENVI> ;定义一个不存在的文件路径 ENVI> file='D:\abc.dat' ENVI> ;打开栅格图像,使用ERROR关键字 ENVI> Raster=e.OpenRaster(file, ERROR=err) ENVI> ;通过判断err是否为空进行错误处理,err不为空时即读取出错 ENVI> if err ne '' then print, '读取出错,错误提示为:'+err 读取出错,错误提示为:Unable to connect to the specified dataset. http://D/abc.dat
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |