[筆記] 錯誤處理函數(try catch)的用法(R/SQL/python)

點閱: 365

紀錄一下各家語法的try catch

新公司要處理一個共70億筆的log資料,要把舊資料備份,新資料移動到另外一個表上。處理過程中發現了一個錯誤(轉換 expression 到資料類型 int 時發生算術溢位錯誤),正在嘗試使用try catch找到是哪筆有問題,google了一下,找到這篇文章,順便紀錄一下

文章


R


tryCatch({
    # R指令
    )
  },
  # 遇到 warning 時的自訂處理函數
  warning = function(msg) {
    message("Original warning message:")
    message(paste0(msg,"\n"))
    return(NULL)
  },
  # 遇到 error 時的自訂處理函數
  error = function(msg) {
    message("Original error message:")
    message(paste0(msg,"\n"))
    return(NA)
  }

SQL


BEGIN CATCH
--DB查詢用
    SELECT ERROR_NUMBER() AS ErrorNumber,
           ERROR_MESSAGE() AS ErrorMessage,
           ERROR_LINE() AS ErrorLine,
           ERROR_PROCEDURE() AS ErrorProcedure,
           ERROR_SEVERITY() AS ErrorSeverity,
           ERROR_STATE() AS ErrorState

--系統拋回訊息用
    DECLARE @ErrorMessage As VARCHAR(1000) = CHAR(10)+'錯誤代碼:' +CAST(ERROR_NUMBER() AS VARCHAR)
                                            +CHAR(10)+'錯誤訊息:'+  ERROR_MESSAGE()
                                            +CHAR(10)+'錯誤行號:'+  CAST(ERROR_LINE() AS VARCHAR)
                                            +CHAR(10)+'錯誤程序名稱:'+    ISNULL(ERROR_PROCEDURE(),'')

    DECLARE @ErrorSeverity As Numeric = ERROR_SEVERITY()
    DECLARE @ErrorState As Numeric = ERROR_STATE()
    RAISERROR( @ErrorMessage, @ErrorSeverity, @ErrorState);--回傳錯誤資訊
END CATCH

SQL錯誤處理的參考文章

python

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("不能除以零!")
    else:
        print("相除結果是: ", result)
    finally:
        print("不論如何都會執行finally")

divide(2, 1)
print("======")
divide(2, 0)

>>> 相除結果是:  2.0
>>> 不論如何都會執行finally
>>> ======
>>> 不能除以零!
>>> 不論如何都會執行finally

About the Author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts