RStudio中stop()与内置错误处理行为差异及统一方法
RStudio中自定义
stop()与内置错误的行为差异及解决方案 1. 两种错误处理行为差异的原因
- 内置错误(比如调用
mass_convert()时的参数缺失)属于函数执行前的参数校验阶段抛出的错误,这类错误发生在用户编写的函数代码运行之前,不在用户代码的调用栈范围内。 - 用
stop()抛出的自定义错误,是在用户编写的函数内部代码执行过程中触发的,属于用户代码栈中的错误。当RStudio调试设置为“Break in Code”时,会对用户代码中抛出的错误自动触发调试模式,而内置参数校验错误不在这个触发范围内,因此不会进入调试。
2. 让自定义错误与内置错误行为一致的方法
要实现自定义错误不触发调试模式,核心是让错误的调用信息不关联到用户代码的调用栈,具体有两种常用方式:
方法1:使用stop()的call. = FALSE参数
修改stop()调用时添加该参数,错误信息不会附带函数调用上下文,RStudio会将其视为非用户代码栈内的错误,从而不触发调试:
mass_convert <- function(mass) { if (mass < 0) { stop("Please input positive mass", call. = FALSE) } mass * 0.03527396 }
方法2:使用rlang::abort()并设置call = NULL
如果使用rlang包的错误函数,可以通过call = NULL屏蔽调用上下文,效果和内置错误一致:
library(rlang) mass_convert <- function(mass) { if (mass < 0) { abort("Please input positive mass", call = NULL) } mass * 0.03527396 }
这两种方式都能让自定义错误仅输出错误信息,而不会触发RStudio的调试模式,和内置参数缺失错误的行为保持一致。
内容的提问来源于stack exchange,提问作者Pratorum
相关产品推荐
相关产品推荐

