首頁 >後端開發 >Python教學 >python的錯誤與異常處理

python的錯誤與異常處理

不言
不言轉載
2018-09-30 13:55:452288瀏覽

這篇文章帶給大家的內容是關於python的錯誤與異常處理,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

一:語法錯誤syntax errors

熟悉語法!

二:異常

①列印錯誤訊息時,異常的類型會以異常的內建名稱顯示,並以呼叫堆疊的形式顯示具體訊息

②常見的異常:
            NameError、
            ZeropisionError、
     #            IndexError    索引超出序列範圍
            KeyError    錯誤
            AttributeError嘗試存取未知的物件屬性
三:異常處理

while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("Oops!  That was no valid number.  Try again   ")

try語句按照以下方式工作;
①首先,執行try子句(在關鍵字try和關鍵字except之間的語句)

②如果沒有異常發生,忽略except子句,try子句執行後結束。

③如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。
④如果異常的類型和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的程式碼。
⑤如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try。
⑥一個 try 語句可能包含多個except子句,分別來處理不同的特定的例外。最多只有一個分支會被執行。
⑦一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組。

except (RuntimeError, TypeError, NameError):
pass

⑧最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。你可以使用這種方法列印一個錯誤訊息,然後再次把異常拋出。
⑨try except 語句也有一個可選的else子句,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行.

三:拋出異常

Python 使用raise 語句拋出一個指定的例外

raise 唯一的一個參數指定了要被拋出的異常。

它必須是一個異常的實例或是異常的類別(也就是Exception 的子類別)


四:使用者自訂例外

    可以透過建立一個新的異常類別來擁有自己的異常。

    異常類別繼承自 Exception 類,可直接繼承,或間接繼承。

    當創建一個模組有可能拋出多種不同的異常時,

    一種通常的做法是為這個包建立一個基礎異常類,

五:定義清理行為

try:
        raise KeyboardInterrupt
    finanlly:
        print("dooo")

    不管try 子句裡面有沒有發生異常,finally 子句都會執行

    如果一個異常在try 子句裡(或在except 和else 子句裡)被拋出,

    而又沒有任何的except 把它截住,那麼這個異常會在finally 子句執行後再次被拋出


六:擴展------------->斷言機制

    assert 等價於布爾真的判定,不滿足拋出異常AssertionError

    用途:  ​​  防禦性的程序

         》


# ---------------------------------------------------------------------#
# 异常处理
# ---------------------------------------------------------------------#
while True:
    try:
        x = int(input("Please enter a number: "))
        break
    except ValueError:
            print("Oops!  That was no valid number.  Try again   ")

# ---------------------------------------------------------------------#
# 抛出异常
# ---------------------------------------------------------------------#
"""
try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
    raise
"""

# ---------------------------------------------------------------------#
# 用户自定义异常
# ---------------------------------------------------------------------#
class MyError(Exception):   # 继承自Exception
    def __init__(self, value):  # 构造函数重写
        self.value = value

    def __str__(self):
        return repr(self.value)
try:
    raise MyError(2*2)  # 抛出异常
except MyError as e:
        print('My exception occurred, value:', e.value)
# 当创建一个模块有可能抛出多种不同的异常时,
# 一种通常的做法是为这个包建立一个基础异常类,
# 然后基于这个基础类为不同的错误情况创建不同的子类
class Error(Exception):
    """Base class for exceptions in this module."""
    pass
class InputError(Error):
    """Exception raised for errors in the input.
    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """
    def __init__(self, expression, message):
        self.expression = expression
        self.message = message
class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next1, message):
        self.previous = previous
        self.next = next1
        self.message = message


try:
    raise InputError(2*2, 45)   # 抛出异常
except InputError:         # 处理异常
        print('My exception occurred')

# ---------------------------------------------------------------------#
# 定义清理行为
# ---------------------------------------------------------------------#

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:                           # 没有异常的时执行
        print("result is", result)
    finally:                        # 无论在任何情况下都会执行的清理行为
        print("executing finally clause")


# 一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,
# 而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出
# divide("2", "1")   #从测试代码

以上是python的錯誤與異常處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除