為自己Coding
為自己Coding

YO~~ 剛跨入AI人工智慧領域的小小工程師, 熱愛自學, 熱愛分享, 下班後的我想為自己Coding, 積極撰寫教學文, 想將自學的程式知識分享給大家, 不斷追求進步的自己, 希望有一天能回饋社會,幫助需要幫助的人, 如果您有什麼很酷的想法,也覺得我還行,歡迎您找我合作~~ IG: https://www.instagram.com/coding_4_me/

給自己的Python小筆記: Debug與測試好幫手- 嘗試try-except與主動引發raise與assert-程式異常處理


Yo~ 今天來記錄一下在程式專案開發時,非常非常重要的一個技能,它能幫助我們在開發的過程中找尋出錯的地方,使用它後,可以很快地知道出問題的地方在哪跟出現的問題是什麼,這樣就不用每次程式Run起來報錯,我還要從線索中找尋錯誤的原因,然後同事跑你的code出錯,你還要過去幫他看問題在哪裡

1. try except 為什麼要使用異常處理呢?


除了我上面講到的原因,最重要的原因是能幫助我們在開發的過程中,我們有時候是沒辦法預期會有哪些錯誤的,使用這個方法就能知道程式哪邊可能會有bug,也就能馬上修正,不要等到寫了一大堆code之後,才發現很多bug來的好解決

2. raise 為什麼要引發錯誤呢?


a. 在執行程式時,我們有時候需要在某些不是我們設定的條件下將程式中止,不然會造成不是我們預期的結果,然後我們可能還沒發現,但只要程式中止了,就能馬上知道哪裡有問題
b. 在撰寫測試程式時,有時候我需要確定這樣的input會讓程式報錯,也就能確保我程式的品質,不會產出不是我預期的結果

3. 簡單講解一下程式出現異常的狀況


a. 這時候結果就會是一個NameError,也就是說Tom並沒有被定義,怎麼知道它等不等於10


4. 錯誤類型分成兩大類: 語法錯誤 與 邏輯錯誤

a. 語法錯誤: 簡單來說就是Python沒有這種寫法,但你卻這樣寫,所出現的錯誤,這種錯誤一定不會通過,所以一開始就得修正好

i. 舉個小例子: 正確的寫法應該是print(“Welcome Tom!!”)和def run(): pass, 這樣的錯誤就稱為SyntaxError,也就是語法問題


b. 邏輯錯誤
i. 舉個例子: 例子中有NameError、ZeroDivisionError、TyeError、IndexError,當然還有想當多類型的Error,我下面會提到


5. 錯誤類型有哪些


a. 常見的錯誤

b. 完整的錯誤類型: 可以參考官方文檔

c. 錯誤類型結構

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

資料來源: https://docs.python.org/3/library/exceptions.html

小叮嚀: 錯誤類型不需要背下來,需要用到的時後,再查就好

6. try except else finally 用法


a. 格式

try:
 要進行錯誤捕捉的程式碼
except 錯誤類型a as e: ##e 是用來記住錯誤資訊,可以不寫
 如果程式發生錯誤類型為a,就會執行這裡
except 錯誤類型b:
 如果錯誤類型為b,就會執行這裡
except (錯誤類型c, 錯誤類型d) as f: ## 用來同時捕捉多個錯誤
 如果錯誤類型符合錯誤類型c與錯誤類型d,就會執行這邊
except Exception as e: 
 如果不知道會發生的錯誤類型為何,可以使用它,除了你寫下要捕捉的錯誤類型,其餘發生的錯誤都會執行這裡
else:
 如果沒有錯誤,就會執行這裡
finally:
 不管有沒有錯誤都會執行這裡

b. 範例:

def try_test(person, salary):
    people = ""
    try:
        if person != "Tom":
            people = person + 'and ' + 'Jen'
            total_month_for_house = 100 / salary 
    
    # except TypeError:
    # print(“你輸入的類型應該要是字串喔!!”)
    except Exception as e:
        print("捕捉錯誤資訊: "+ str(e))
        print("萬能用法: 當不知道會發生什麼錯誤時的捕捉錯誤方法")
    
    else:
        print("正確執行 :")
        print("Hello "+people)
        print("你的薪水需要"+str(total_month_for_house)+"個月來完成付款")
    finally:
        print("不管如何都會執行finally")
        print("====================================")

執行結果:


7. raise與assert: 引發錯誤並中斷程式


a. 有時候一些不符合我們想要的情況發生時,我們需要強制將程式中斷,這時就需要raise與assert

b. raise
i. 格式: raise (錯誤類型)
ii. 舉例:

raise TypeError


c. assert
i. 格式: assert False, “中斷原因”
ii. 舉例:

assert False, “有錯,請檢察input data”

 8. 程式裡面每個程式片段都使用try來查錯誤嗎?

雖然try-except是非常好用的錯誤處理方式,但是並不適合讓我們的程式佈滿try-except,這樣會讓我們的程式可讀性變低,導致維護上的困難,所以只要在容易出錯的程式上加上就可以囉


大家可以開始著手採用try-except、raise、assert來幫助我們做到好的錯誤管裡,讓程式專案可以順利開發下去,希望這次對大家有很大的幫忙,有任何問題都可以找我討論喔~~


Reference:
https://docs.python.org/3/library/exceptions.html

python的嘗試try與錯誤error處理
前言 The Zen of Python中的其中一句:Errors should never pass silently. Unless explicitly…freelancerlife.info

Python3异常处理, raise异常,自定义异常类_qq_43471020的博客-CSDN博客_python3 raise
常见的异常处理语法格式:try: 尝试执行某个操作 如果没有异常,操作完成 如果发生异常,捕捉并尝试解决异常except 异常类a as e: # e 是一个变量,记录异常类的信息,通常是Exception…blog.csdn.net



CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论