python中的try except與R語(yǔ)言中的tryCatch異常解決
1. 起因
當(dāng)我們需要寫一個(gè)非常非常長(zhǎng)的循環(huán)時(shí),通常在某個(gè)循環(huán)如果出現(xiàn)error,那么整個(gè)代碼后面的循環(huán)就不能進(jìn)行。
這時(shí)候試想,如果你在服務(wù)器上掛一個(gè)要跑很久的循環(huán)(并行),亦或是需要在自己電腦上掛一晚上跑東西,可能剛點(diǎn)完運(yùn)行,美滋滋地上床后,程序突然出現(xiàn)問(wèn)題。這時(shí)第二天滿懷期待地點(diǎn)亮屏幕,發(fā)現(xiàn)是一個(gè)大大的紅紅的ERROR時(shí),估計(jì)頭發(fā)或許又會(huì)稀疏了不少。
于是這時(shí)候就會(huì)想,能不能在跑的時(shí)候,如果程序出現(xiàn)錯(cuò)誤,那么我們直接繞開(kāi)這些問(wèn)題,進(jìn)行下一次循環(huán)。
其實(shí)這種問(wèn)題在Python與R中,都有相應(yīng)的解決方法。
2. Python中的try/except
首先貼上官方說(shuō)明文檔:
英文文檔: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")
這里解釋一下程序邏輯:首先運(yùn)行try,如果:
不報(bào)錯(cuò),就會(huì)跳到else,最后到final
分母為0的錯(cuò)誤,會(huì)跳到except ZeroDivisionError,然后直接忽略else到最后的finally
其他類型的錯(cuò)誤,會(huì)忽略except ZeroDivisionError,然后到except,接著再忽略else到最后的finally
也就是說(shuō)無(wú)論如何,finally都是會(huì)運(yùn)行的。
下面我們驗(yàn)證三種輸入:
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ù)也是同樣解決類似的問(wèn)題。
可參考官方說(shuō)明文檔:trycatch: Evaluates an expression with the possibility to catch exceptions (DEPRECATED)
然后運(yùn)行上面類似的程序,來(lái)看看用法
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后面是要加上小括號(hào)和大括號(hào)的。另外我加上了err這個(gè)對(duì)象,相當(dāng)于會(huì)輸出報(bào)錯(cuò)信息。
下面為運(yùn)行結(jié)果:
1)情形一
輸入:
divide(1, 2)
輸出:
[1] "executing finally clause" [1] 0.5
我是先finally,再return,所以會(huì)是上述的輸出結(jié)果。
2)情形二
輸入:
divide(1, 0)
輸出:
[1] "executing finally clause" [1] Inf
注意,R會(huì)輸出Inf,這點(diǎn)與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"
補(bǔ)充
最后如果我們?nèi)绻胍?code>R中忽略一些可能報(bào)錯(cuò)的代碼時(shí)(不需要輸出任何報(bào)錯(cuò)信息),直接使用try()即可。
以上就是python中的try except與R語(yǔ)言中的tryCatch異常解決的詳細(xì)內(nèi)容,更多關(guān)于python與R語(yǔ)言異常解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中小數(shù)點(diǎn)后取2位(四舍五入)及取2位(四舍五不入)的方法
這篇文章主要給大家介紹了python中小數(shù)點(diǎn)后取2位(四舍五入)及取2位(四舍五不入)的方法,在Python中取兩位小數(shù)的方法其實(shí)非常簡(jiǎn)單,需要的朋友可以參考下2023-08-08
Python單鏈表簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要介紹了Python單鏈表簡(jiǎn)單實(shí)現(xiàn)代碼,結(jié)合實(shí)例形式分析了Python單鏈表的具體定義與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-04-04
python獲取當(dāng)前時(shí)間對(duì)應(yīng)unix時(shí)間戳的方法
這篇文章主要介紹了python獲取當(dāng)前時(shí)間對(duì)應(yīng)unix時(shí)間戳的方法,涉及Python時(shí)間操作的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05
Pandas.DataFrame重置Series的索引index(reset_index)
本文主要介紹了Pandas.DataFrame重置Series的索引index(reset_index),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
python函數(shù)缺省值與引用學(xué)習(xí)筆記分享
有關(guān)一個(gè)在函數(shù)參數(shù)設(shè)置缺省值與引用的問(wèn)題,這個(gè)問(wèn)題是大多數(shù)Pythoner可能會(huì)忽視的問(wèn)題,作個(gè)筆記,以備后閱,同時(shí)供需要的朋友參考2013-02-02
python封裝json格式字符串并處理單雙引號(hào)問(wèn)題
大家好,本篇文章主要講的是python封裝json格式字符串并處理單雙引號(hào)問(wèn)題,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
使用pyhon繪圖比較兩個(gè)手機(jī)屏幕大小(實(shí)例代碼)
這篇文章主要介紹了使用pyhon繪圖比較兩個(gè)手機(jī)屏幕大小,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01

