溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決python中的try except與R語言中的tryCatch異常問題

發(fā)布時(shí)間:2021-11-13 19:08:48 來源:億速云 閱讀:224 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下如何解決python中的try except與R語言中的tryCatch異常問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

    1. 起因

    當(dāng)我們需要寫一個(gè)非常非常長的循環(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)問題。這時(shí)第二天滿懷期待地點(diǎn)亮屏幕,發(fā)現(xiàn)是一個(gè)大大的紅紅的ERROR時(shí),估計(jì)頭發(fā)或許又會稀疏了不少。

    于是這時(shí)候就會想,能不能在跑的時(shí)候,如果程序出現(xiàn)錯(cuò)誤,那么我們直接繞開這些問題,進(jìn)行下一次循環(huán)。

    其實(shí)這種問題在PythonR中,都有相應(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")

    這里解釋一下程序邏輯:首先運(yùn)行try,如果:

    不報(bào)錯(cuò),就會跳到else,最后到final

    分母為0的錯(cuò)誤,會跳到except ZeroDivisionError,然后直接忽略else到最后的finally

    其他類型的錯(cuò)誤,會忽略except ZeroDivisionError,然后到except,接著再忽略else到最后的finally

    也就是說無論如何,finally都是會運(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ù)也是同樣解決類似的問題。

    可參考官方說明文檔:trycatch: Evaluates an expression with the possibility to catch exceptions (DEPRECATED)

    然后運(yùn)行上面類似的程序,來看看用法

    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這個(gè)對象,相當(dāng)于會輸出報(bào)錯(cuò)信息。

    下面為運(yùn)行結(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,這點(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語言中的tryCatch異常問題”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI