在R中使用tryCatch()保留完整错误信息的方法
问题描述
调用freq(x = r, zone = p)时触发的完整错误信息如下:
Error in `$<-.data.frame`(`*tmp*`, "zone", value = 1L) : replacement has 1 row, data has 0
但使用tryCatch()捕获错误时,仅能获取replacement has 1 row, data has 0这部分内容,希望保留包含前缀的完整错误信息。相关代码示例:
# 创建栅格 r <- rast(nrows=10, ncols=10) set.seed(2) values(r) <- sample(5, ncell(r), replace=TRUE) freq(r) # 创建第三个栅格并修改范围后转为矢量 r3 <- rast(ncols=2, nrows=2) values(r3) <- 1:ncell(r3) ext(r3) <- ext(-25, -20, 0, 2) # 几乎无重叠区域 p <- as.polygons(r3) # 尝试获取频率,触发错误 errorkeep = tryCatch(expr = { freq(x = r, zone = p) }, error = function(cond) { print(cond) } )
解决方法
要捕获完整错误信息,需从错误对象中提取调用部分和消息部分,以下是几种可行方式:
- 方法1:拼接错误调用与消息
修改tryCatch的错误处理函数,将错误的调用代码和消息拼接成完整文本:
errorkeep = tryCatch(expr = { freq(x = r, zone = p) }, error = function(cond) { full_error <- paste0("Error in ", deparse(cond$call), " : ", cond$message) print(full_error) return(full_error) } )
运行后会输出完整错误内容:
[1] "Error in `$<-.data.frame`(`*tmp*`, \"zone\", value = 1L) : replacement has 1 row, data has 0"
- 方法2:直接转换错误对象为字符串
使用as.character()将错误对象转为字符串,直接获取完整信息:
errorkeep = tryCatch(expr = { freq(x = r, zone = p) }, error = function(cond) { full_error <- as.character(cond) print(full_error) return(full_error) } )
- 方法3:打印完整错误对象结构
默认print(cond)会简化输出,改用print.default()可显示错误对象的完整结构,包含call和message等字段:
errorkeep = tryCatch(expr = { freq(x = r, zone = p) }, error = function(cond) { print.default(cond) return(cond) } )
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

