1. 起因
當我們需要寫一個非常非常長的循環時,通常在某個循環如果出現error,那么整個代碼后面的循環就不能進行。
這時候試想,如果你在服務器上掛一個要跑很久的循環(并行),亦或是需要在自己電腦上掛一晚上跑東西,可能剛點完運行,美滋滋地上床后,程序突然出現問題。這時第二天滿懷期待地點亮屏幕,發現是一個大大的紅紅的ERROR
時,估計頭發或許又會稀疏了不少。
于是這時候就會想,能不能在跑的時候,如果程序出現錯誤,那么我們直接繞開這些問題,進行下一次循環。
其實這種問題在Python
與R
中,都有相應的解決方法。
2. Python中的try/except
首先貼上官方說明文檔:
英文文檔:https://docs.python.org/3/tutorial/errors.html
中文文檔:https://docspy3zh.readthedocs.io/en/lates t/tutorial/errors.html
這里我們仿造文檔中間的例子進行構造自己的例子,具體如下述代碼所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
其他類型的錯誤,會忽略exc
ept ZeroDivisionError
,然后到except
,接著再忽略else
到最后的finally
也就是說無論如何,finally
都是會運行的。
下面我們驗證三種輸入:
1)情形一
輸入:
1
|
divide( 2 , 1 ) |
輸出:
1
2
|
result is 2 . 0 executing finally clause |
2)情形二
輸入:
1
|
divide( 2 , 0 ) |
輸出:
1
2
|
division by zero! executing finally clause |
3)情形三
1
|
divide( "2" , "1" ) |
輸出:
1
2
|
error! executing finally clause |
3. R中的tryCatch
同樣的,在R
中的tryCatch
函數也是同樣解決類似的問題。
可參考官方說明文檔:trycatch: Evaluates an expression with the possibility to catch exceptions (DEPRECATED)
然后運行上面類似的程序,來看看用法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
這個對象,相當于會輸出報錯信息。
下面為運行結果:
1)情形一
輸入:
1
|
divide( 1 , 2 ) |
輸出:
1
2
|
[ 1 ] "executing finally clause" [ 1 ] 0 . 5 |
我是先finally
,再return
,所以會是上述的輸出結果。
2)情形二
輸入:
1
|
divide( 1 , 0 ) |
輸出:
1
2
|
[ 1 ] "executing finally clause" [ 1 ] Inf |
注意,R會輸出Inf
,這點與Python不同。
3)情形三
輸入:
1
|
divide( 1 , '0' ) |
輸出:
1
2
3
4
|
error! Error in cat( "error!" , err, "\n" ) : argument 2 (type 'list' ) cannot be handled by 'cat' [ 1 ] "executing finally clause" |
補充
最后如果我們如果想要在R
中忽略一些可能報錯的代碼時(不需要輸出任何報錯信息),直接使用try()
即可。
以上就是python中的try except與R語言中的tryCatch異常解決的詳細內容,更多關于python與R語言異常解決的資料請關注服務器之家其它相關文章!
原文鏈接:https://kanny.blog.csdn.net/article/details/84667843