Dd *_* Pp 306 exception-handling r exception try-catch r-faq
我想编写trycatch
代码来处理从网上下载时的错误.
url <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz")
y <- mapply(readLines, con=url)
Run Code Online (Sandbox Code Playgroud)
这两个语句成功运行.下面,我创建一个不存在的Web地址:
url <- c("xxxxx", "http://en.wikipedia.org/wiki/Xz")
Run Code Online (Sandbox Code Playgroud)
url[1]
不存在.如何编写trycatch
循环(函数)以便:
Rap*_*ter 559
那么:欢迎来到R世界;-)
干得好
urls <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz",
"xxxxx"
)
readUrl <- function(url) {
out <- tryCatch(
{
# Just to highlight: if you want to use more than one
# R expression in the "try" part then you'll have to
# use curly brackets.
# 'tryCatch()' will return the last evaluated expression
# in case the "try" part was completed successfully
message("This is the 'try' part")
readLines(con=url, warn=FALSE)
# The return value of `readLines()` is the actual value
# that will be returned in case there is no condition
# (e.g. warning or error).
# You don't need to state the return value via `return()` as code
# in the "try" part is not wrapped insided a function (unlike that
# for the condition handlers for warnings and error below)
},
error=function(cond) {
message(paste("URL does not seem to exist:", url))
message("Here's the original error message:")
message(cond)
# Choose a return value in case of error
return(NA)
},
warning=function(cond) {
message(paste("URL caused a warning:", url))
message("Here's the original warning message:")
message(cond)
# Choose a return value in case of warning
return(NULL)
},
finally={
# NOTE:
# Here goes everything that should be executed at the end,
# regardless of success or error.
# If you want more than one expression to be executed, then you
# need to wrap them in curly brackets ({...}); otherwise you could
# just have written 'finally=<expression>'
message(paste("Processed URL:", url))
message("Some other message at the end")
}
)
return(out)
}
Run Code Online (Sandbox Code Playgroud)
> y <- lapply(urls, readUrl)
Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
Some other message at the end
Processed URL: http://en.wikipedia.org/wiki/Xz
Some other message at the end
URL does not seem to exist: xxxxx
Here's the original error message:
cannot open the connection
Processed URL: xxxxx
Some other message at the end
Warning message:
In file(con, "r") : cannot open file 'xxxxx': No such file or directory
Run Code Online (Sandbox Code Playgroud)
> head(y[[1]])
[1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"
[2] "<html><head><title>R: Functions to Manipulate Connections</title>"
[3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
[4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"
[5] "</head><body>"
[6] ""
> length(y)
[1] 3
> y[[3]]
[1] NA
Run Code Online (Sandbox Code Playgroud)
试着抓
tryCatch
返回与执行相关的值,expr
除非出现错误或警告.在这种情况下,return(NA)
可以通过提供相应的处理函数来指定特定的返回值(参见上文)(请参阅参数error
和warning
in ?tryCatch
).这些可以是已经存在的函数,但您也可以在其中定义它们tryCatch()
(如上所述).
选择处理函数的特定返回值的含义
正如我们已经指定的那样NA
,如果出现错误应该返回,第三个元素y
是NA
.如果我们要选择NULL
是返回值,长度y
也只是一直2
不是3
因为lapply()
将简单地"忽略"是返回值NULL
.另请注意,如果未指定显式返回值via return()
,则处理函数将返回NULL
(即出现错误或警告条件).
"不受欢迎的"警告信息
由于warn=FALSE
似乎没有任何影响,另一种抑制警告的方法(在这种情况下并不是真正感兴趣)是使用
suppressWarnings(readLines(con=url))
Run Code Online (Sandbox Code Playgroud)
代替
readLines(con=url, warn=FALSE)
Run Code Online (Sandbox Code Playgroud)
多个表达式
请注意,您也可以将多个表达式中的"实际表达部分"(争论expr
的tryCatch()
),如果你在大括号包起来(就像我在所示finally
部分).
her*_*arn 60
R使用函数来实现try-catch块:
语法有点像这样:
result = tryCatch({
expr
}, warning = function(warning_condition) {
warning-handler-code
}, error = function(error_condition) {
error-handler-code
}, finally={
cleanup-code
})
Run Code Online (Sandbox Code Playgroud)
在tryCatch()中,可以处理两个"条件":"警告"和"错误".编写每个代码块时要理解的重要事项是执行状态和范围. @资源
Rah*_*hul 34
tryCatch
具有稍微复杂的语法结构。但是,一旦我们理解了构成一个完整的tryCatch调用的4个部分,如下所示,就很容易记住:
expr:[ 必需 ]要评估的R代码
错误:[ 可选 ]如果在评估expr中的代码时发生错误,应该怎么办
警告:[ 可选 ]如果在评估expr中的代码时发生警告,应该怎么办
最终:[ 可选 ]退出tryCatch调用之前应该执行什么操作,而不管expr是否成功运行,是否有错误或警告
tryCatch(
expr = {
# Your code...
# goes here...
# ...
},
error = function(e){
# (Optional)
# Do this if an error is caught...
},
warning = function(w){
# (Optional)
# Do this if an warning is caught...
},
finally = {
# (Optional)
# Do this at the end before quitting the tryCatch structure...
}
)
Run Code Online (Sandbox Code Playgroud)
因此,一个用于计算值对数的玩具示例可能类似于:
log_calculator <- function(x){
tryCatch(
expr = {
message(log(x))
message("Successfully executed the log(x) call.")
},
error = function(e){
message('Caught an error!')
print(e)
},
warning = function(w){
message('Caught an warning!')
print(w)
},
finally = {
message('All done, quitting.')
}
)
}
Run Code Online (Sandbox Code Playgroud)
现在,运行三种情况:
有效案例
log_calculator(10)
# 2.30258509299405
# Successfully executed the log(x) call.
# All done, quitting.
Run Code Online (Sandbox Code Playgroud)
“警告”案
log_calculator(-10)
# Caught an warning!
# <simpleWarning in log(x): NaNs produced>
# All done, quitting.
Run Code Online (Sandbox Code Playgroud)
“错误”案例
log_calculator("log_me")
# Caught an error!
# <simpleError in log(x): non-numeric argument to mathematical function>
# All done, quitting.
Run Code Online (Sandbox Code Playgroud)
我写了一些我经常使用的有用用例。在此处查找更多详细信息:https : //rsangole.netlify.com/post/try-catch/
希望这会有所帮助。
Pau*_*aul 32
这是一个简单的例子:
# Do something, or tell me why it failed
my_update_function <- function(x){
tryCatch(
# This is what I want to do...
{
y = x * 2
return(y)
},
# ... but if an error occurs, tell me what happened:
error=function(error_message) {
message("This is my custom message.")
message("And below is the error message from R:")
message(error_message)
return(NA)
}
)
}
Run Code Online (Sandbox Code Playgroud)
如果您还想捕获"警告",只需添加warning=
类似于该error=
部分.
小智 22
因为我只是失去了两天的生命,试图解决tryCatch的irr功能,我想我应该分享我的智慧(以及缺少的东西).FYI - irr是FinCal的实际功能,在这种情况下,在少数情况下在大型数据集中出现错误.
将tryCatch设置为函数的一部分.例如:
irr2 <- function (x) {
out <- tryCatch(irr(x), error = function(e) NULL)
return(out)
}
Run Code Online (Sandbox Code Playgroud)要使错误(或警告)起作用,您实际上需要创建一个函数.我最初的错误部分只是写了error = return(NULL)
,所有值都回来了null.
记得要创建一个子输出(比如我的"out")和return(out)
.