使用R中的trycatch抑制系统错误

时间:2014-09-23 09:49:50

标签: r error-handling try-catch

虽然我的pdf文件已转换为文本但我无法抑制此错误,但我无法抑制错误。

 tryCatch(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T))
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
> suppressWarnings(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T))
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
>tryCatch(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T), error = function(e) e)
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
> suppressMessages(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T))
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
> tryCatch(suppressWarnings(capture.output(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T))), error = function(e) e)
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
character(0)
> tryCatch({system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T)}, error = function(e) e)
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function

为什么我无法抑制它?我怎样才能摆脱这个错误?谢谢。

修改

使用silent=TRUEfunction(e){invisible(e)}

tryCatch(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T), error = function(e){invisible(e)})
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
> try(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = T),silent=TRUE)
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function
Syntax Error: Missing or invalid 'Bounds' entry in stitching function

EDITED

它停止了错误,但它也停止了功能,pdf文件没有被转换为文本。

tryCatch(system2(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = TRUE, 
                 stdout=TRUE, stderr=TRUE), 
         error=function(err) NA)
[1] NA

源代码

dest=paste("C:/wamp/www/LU/my/pdffiles",file_list[i],sep="/")
exe <- "C:\\Program Files\\xpdfbin-win-3.03\\bin32\\pdftotext.exe"
try(system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = TRUE),
    silent=TRUE)

2 个答案:

答案 0 :(得分:5)

通常会写一个

tryCatch({
    system("xyz")
}, error=function(err) {
    ## do something with 'err', then maybe throw it again stop(err)
    ## or providing an alternative return value
    NA
})

所以

> xx = tryCatch(stop("oops"), error=function(err) NA)
> xx
[1] NA

但似乎system()引发的某些错误无法以这种方式捕获。

> xx = tryCatch(system("foobar"), error=function(err) NA)
sh: 1: foobar: not found

可以完成某些事情的提示来自xx:

的值
> xx
[1] 127

帮助页面首先指向system2(),而不是我们看到

If 'stdout = TRUE' or 'stderr = TRUE', a character vector giving
the output of the command, one line per character string.  (Output
lines of more than 8095 bytes will be split.)  If the command
could not be run an R error is generated.

果然

> tryCatch(system2("foobar", stdout=TRUE, stderr=TRUE), error=function(err) NA)
[1] NA

答案 1 :(得分:1)

之前从未实际使用过tryCatch(),但似乎你的错误函数是error=function(e) e,所以你只是返回你得到的错误。

我过去使用try()选项silent=TRUE来避免显示错误消息。这样的事情(免责声明,try的帮助页面提到使用tryCatch可能会更有效率):

res=try(runif(Inf), silent=TRUE)
if(class(res)=="try-error") {
  print("some error happened")
} else {
  print(res)
}

res=try(runif(10), silent=TRUE)
if(class(res)=="try-error") {
  print("some error happened")
} else {
  print(res)
}

可能有更好的方法可以做到这一点,希望其他人能够纠正我的解决方案。

相关问题