conditions
位於 base
包(package)。 說明
這些函數提供了處理異常情況(包括錯誤和警告)的機製。
用法
tryCatch(expr, ..., finally)
withCallingHandlers(expr, ...)
globalCallingHandlers(...)
signalCondition(cond)
simpleCondition(message, call = NULL)
simpleError (message, call = NULL)
simpleWarning (message, call = NULL)
simpleMessage (message, call = NULL)
errorCondition(message, ..., class = NULL, call = NULL)
warningCondition(message, ..., class = NULL, call = NULL)
## S3 method for class 'condition'
as.character(x, ...)
## S3 method for class 'error'
as.character(x, ...)
## S3 method for class 'condition'
print(x, ...)
## S3 method for class 'restart'
print(x, ...)
conditionCall(c)
## S3 method for class 'condition'
conditionCall(c)
conditionMessage(c)
## S3 method for class 'condition'
conditionMessage(c)
withRestarts(expr, ...)
computeRestarts(cond = NULL)
findRestart(name, cond = NULL)
invokeRestart(r, ...)
tryInvokeRestart(r, ...)
invokeRestartInteractively(r)
isRestart(x)
restartDescription(r)
restartFormals(r)
suspendInterrupts(expr)
allowInterrupts(expr)
.signalSimpleWarning(msg, call)
.handleSimpleError(h, msg, call)
.tryResumeInterrupt()
參數
c |
一個條件對象。 |
call |
調用表達式。 |
cond |
一個條件對象。 |
expr |
要評估的表達式。 |
finally |
返回或退出之前要計算的表達式。 |
h |
函數。 |
message |
字符串。 |
msg |
字符串。 |
name |
命名重啟的字符串。 |
r |
重新啟動對象。 |
x |
對象。 |
class |
命名條件類的字符串。 |
... |
附加參數;請參閱下麵的詳細信息。 |
細節
條件係統提供了一種用於發出信號和處理異常情況(包括錯誤和警告)的機製。條件表示為包含有關所發生條件的信息的對象,例如消息和發生條件的調用。目前的條件是 S3 風格的對象,盡管這最終可能會改變。
條件是從抽象類 condition
繼承的對象。錯誤和警告是從抽象子類 error
和 warning
繼承的對象。類simpleError
是stop
和所有內部錯誤信號使用的類。同樣,simpleWarning
由 warning
使用,simpleMessage
由 message
使用。同名的構造函數采用一個說明條件的字符串作為參數和一個可選的調用。函數conditionMessage
和conditionCall
是返回消息和條件調用的通用函數。
函數 errorCondition
可用於構造特定類的錯誤條件,並將附加字段指定為 ...
參數。 warningCondition
與警告類似。
條件由 signalCondition
發出信號。此外,stop
和 warning
函數已修改為也接受條件參數。
函數 tryCatch
在 ...
參數中提供的處理程序可用的上下文中計算其表達式參數。然後在調用 tryCatch
的上下文中計算 finally
表達式;也就是說,在計算 finally
表達式時,提供給當前 tryCatch
調用的處理程序不處於活動狀態。
tryCatch
的 ...
參數中提供的處理程序是在 expr
評估期間建立的。如果在計算 expr
時未發出任何條件信號,則 tryCatch
返回表達式的值。
如果在評估 expr
時發出條件信號,則將從最近建立的處理程序開始檢查已建立的處理程序,以查找與條件類別匹配的處理程序。當在單個 tryCatch
中提供多個處理程序時,第一個處理程序被認為比第二個處理程序更新。如果找到處理程序,則控製權將轉移到建立處理程序的 tryCatch
調用,找到處理程序並取消所有最近的處理程序,以條件作為參數調用處理程序,處理程序返回的結果為作為 tryCatch
調用的值返回。
調用處理程序由 withCallingHandlers
建立。如果發出了條件信號且適用的處理程序是調用處理程序,則 signalCondition
在發出條件信號的上下文中調用該處理程序,但可用處理程序僅限於處理程序堆棧中調用的處理程序下方的處理程序。如果處理程序返回,則嘗試下一個處理程序;一旦嘗試了最後一個處理程序,signalCondition
將返回 NULL
。
globalCallingHandlers
建立全局調用處理程序。僅在調用使用 withCallingHandlers
動態注冊的其他處理程序後,才調用這些處理程序作為最後的手段。它們在 error
全局選項(這是用於全局處理錯誤的舊接口)之前調用。多次注冊相同的處理程序會將該處理程序移動到堆棧頂部,這可確保首先調用它。全局處理程序是定義通用記錄器(例如在全局工作區中保存最後一個錯誤對象)或通用恢複策略(例如通過 retry_loadNamespace
重新啟動安裝丟失的包)的好地方。
與 withCallingHandlers
和 tryCatch
一樣,globalCallingHandlers
采用命名處理程序。與這些函數不同,它還有一個類似 options
的接口:您可以通過傳遞單個命名處理程序列表來建立處理程序。要注銷所有全局處理程序,請提供單個'NULL'。已刪除處理程序的列表會以不可見的方式返回。最後,不帶參數調用 globalCallingHandlers
會明顯返回當前建立的處理程序列表。
在執行默認中斷操作之前,用戶中斷會發出直接從類 condition
繼承的類 interrupt
的條件信號。
重新啟動用於建立恢複協議。它們可以使用 withRestarts
建立。一種預先建立的重新啟動是 abort
重新啟動,它表示跳轉到頂層。
findRestart
和 computeRestarts
查找可用的重新啟動。 findRestart
返回指定名稱的最近建立的重新啟動。 computeRestarts
返回所有重新啟動的列表。兩者都可以被賦予一個條件參數,然後將忽略不適用於該條件的重新啟動。
invokeRestart
將控製轉移到建立指定重新啟動的點,並使用參數(如果有)調用重新啟動的處理程序,這些參數作為 invokeRestart
的附加參數給出。 invokeRestart
的重啟參數可以是字符串,在這種情況下,findRestart
用於查找重啟。如果沒有發現重新啟動,則會拋出錯誤。
tryInvokeRestart
是 invokeRestart
的變體,當使用 findRestart
找不到重新啟動時,它會靜默返回。由於給定類的條件可能會使用任意協議(錯誤、警告等)發出信號,因此建議在處理從外部上下文發出的條件時使用此許可變體。例如,"muffleWarning"
重新啟動的調用應該是可選的,因為警告可能是由用戶或來自具有 stop
或 message
協議的不同包發出的信號。僅當您可以控製信令上下文時,或者當重新啟動不可用時出現邏輯錯誤時,才使用invokeRestart
。
可以通過多種方式指定 withRestarts
的新重新啟動。最簡單的是 name = function
形式,其中該函數是調用重新啟動時要調用的處理程序。另一個簡單的變體是 name = string
,其中字符串存儲在 findRestart
返回的重新啟動對象的 description
字段中;在這種情況下,處理程序忽略其參數並返回 NULL
。重新啟動規範最靈活的形式是作為可以包含多個字段的列表,包括 handler
、 description
和 test
。 test
字段應包含一個隻有一個參數的函數,即一個條件,如果重新啟動適用於該條件,則返回 TRUE
,如果不適用,則返回 FALSE
;對於所有條件,默認函數都會返回TRUE
。
可以為重新啟動指定的另一個字段是 interactive
。這應該是一個沒有參數的函數,它返回一個參數列表以傳遞給重新啟動處理程序。如果需要,可以通過與用戶交互來獲取該列表。函數 invokeRestartInteractively
調用此函數來獲取調用重新啟動時要使用的參數。默認的 interactive
方法向用戶查詢處理函數的形式參數的值。
使用 suspendInterrupts
計算表達式時可以暫停中斷。可以使用 allowInterrupts
啟用中斷來計算子表達式。這些函數可用於確保清理處理程序不會被中斷。
.signalSimpleWarning
、 .handleSimpleError
和 .tryResumeInterrupt
在內部使用,不應直接調用。
例子
tryCatch(1, finally = print("Hello"))
e <- simpleError("test error")
## Not run:
stop(e)
tryCatch(stop(e), finally = print("Hello"))
tryCatch(stop("fred"), finally = print("Hello"))
## End(Not run)
tryCatch(stop(e), error = function(e) e, finally = print("Hello"))
tryCatch(stop("fred"), error = function(e) e, finally = print("Hello"))
withCallingHandlers({ warning("A"); 1+2 }, warning = function(w) {})
## Not run:
{ withRestarts(stop("A"), abort = function() {}); 1 }
## End(Not run)
withRestarts(invokeRestart("foo", 1, 2), foo = function(x, y) {x + y})
##--> More examples are part of
##--> demo(error.catching)
參考
The tryCatch
mechanism is similar to Java
error handling. Calling handlers are based on Common Lisp and
Dylan. Restarts are based on the Common Lisp restart mechanism.
也可以看看
stop
和 warning
信號條件,而 try
本質上是 tryCatch
的簡化版本。 tools
包中的 assertCondition
測試條件是否已發出信號並可與上述多個處理程序配合使用。
相關用法
- R connections 操作連接的函數(文件、URL...)
- R conflicts 在搜索路徑上搜索被遮罩的對象
- R col 列索引
- R comment 查詢或設置“評論”屬性
- R complex 複數和基本函數
- R colSums 形成行和列的總和及平均值
- R commandArgs 提取命令行參數
- R colnames 行和列名稱
- R chartr 字符翻譯和裝箱
- R chol2inv Cholesky(或 QR)分解的逆分解
- R cumsum 累積和、乘積和極值
- R character 字符向量
- R c 將值組合到向量或列表中
- R cut 將數字轉換為因子
- R class 對象類
- R chooseOpsMethod 選擇適當的操作方法
- R chol 喬列斯基分解
- R cbind 按行或列組合 R 對象
- R crossprod 矩陣叉積
- R curlGetHeaders 從 URL 中檢索標頭
- R cat 連接並打印
- R capabilities 此 R 版本的報告函數
- R callCC 調用當前延續
- R call 函數調用
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Condition Handling and Recovery。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。