python中的try except與R語言中的tryCatch異常解決
1. 起因
當(dāng)我們需要寫一個非常非常長的循環(huán)時,通常在某個循環(huán)如果出現(xiàn)error,那么整個代碼后面的循環(huán)就不能進(jìn)行。
這時候試想,如果你在服務(wù)器上掛一個要跑很久的循環(huán)(并行),亦或是需要在自己電腦上掛一晚上跑東西,可能剛點完運行,美滋滋地上床后,程序突然出現(xiàn)問題。這時第二天滿懷期待地點亮屏幕,發(fā)現(xiàn)是一個大大的紅紅的ERROR時,估計頭發(fā)或許又會稀疏了不少。
于是這時候就會想,能不能在跑的時候,如果程序出現(xiàn)錯誤,那么我們直接繞開這些問題,進(jìn)行下一次循環(huán)。
其實這種問題在Python與R中,都有相應(yīng)的解決方法。
2. Python中的try/except
首先貼上官方說明文檔:
英文文檔:https://docs.python.org/3/tutorial/errors.html
中文文檔:https://docspy3zh.readthedocs.io/en/lates t/tutorial/errors.html
這里我們仿造文檔中間的例子進(jìn)行構(gòu)造自己的例子,具體如下述代碼所示。
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
except:
print('unknown error!')
else:
print("result is", result)
finally:
print("executing finally clause")
這里解釋一下程序邏輯:首先運行try,如果:
不報錯,就會跳到else,最后到final
分母為0的錯誤,會跳到except ZeroDivisionError,然后直接忽略else到最后的finally
其他類型的錯誤,會忽略except ZeroDivisionError,然后到except,接著再忽略else到最后的finally
也就是說無論如何,finally都是會運行的。
下面我們驗證三種輸入:
1)情形一
輸入:
divide(2, 1)
輸出:
result is 2.0 executing finally clause
2)情形二
輸入:
divide(2, 0)
輸出:
division by zero! executing finally clause
3)情形三
divide("2", "1")
輸出:
error! executing finally clause
3. R中的tryCatch
同樣的,在R中的tryCatch函數(shù)也是同樣解決類似的問題。
可參考官方說明文檔:trycatch: Evaluates an expression with the possibility to catch exceptions (DEPRECATED)
然后運行上面類似的程序,來看看用法
divide <- function(x, y) {
result <- tryCatch({
x / y
}, warning = function(war) {
cat("warning!", war, "\n")
}, error = function(err) {
cat("error!", err, "\n")
}, finally = {
print("executing finally clause")
})
return(result)
}
這里需要格外注意的是,tryCatch后面是要加上小括號和大括號的。另外我加上了err這個對象,相當(dāng)于會輸出報錯信息。
下面為運行結(jié)果:
1)情形一
輸入:
divide(1, 2)
輸出:
[1] "executing finally clause" [1] 0.5
我是先finally,再return,所以會是上述的輸出結(jié)果。
2)情形二
輸入:
divide(1, 0)
輸出:
[1] "executing finally clause" [1] Inf
注意,R會輸出Inf,這點與Python不同。
3)情形三
輸入:
divide(1, '0')
輸出:
error!
Error in cat("error!", err, "\n") :
argument 2 (type 'list') cannot be handled by 'cat'
[1] "executing finally clause"
補充
最后如果我們?nèi)绻胍?code>R中忽略一些可能報錯的代碼時(不需要輸出任何報錯信息),直接使用try()即可。
以上就是python中的try except與R語言中的tryCatch異常解決的詳細(xì)內(nèi)容,更多關(guān)于python與R語言異常解決的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信