錯誤和異常

錯誤和異常

1 語法錯誤

在初學Python的時候最容易犯的錯誤就是Python的語法錯誤。python

在Python中,若是錯誤信息是以 "SyntaxError" 開頭,表示這是一個語法錯誤;Python解釋器會提示在哪一個文件的第幾行的什麼位置出現錯誤;語法錯誤一般意味着書寫格式或使用方式不正確。函數

2 異常

程序在運行時,若是Python解釋器遇到一個錯誤,會中止程序的執行,而且提示一些錯誤信息,這就是異常。code

程序中止執行而且提示錯誤信息這個動做,一般稱之爲拋出異常(raise Exception)對象

在這裏插入圖片描述

簡單的捕獲異常

在程序開發中,若是對某些代碼的執行不能肯定是否正確,能夠增長try(嘗試)來捕獲異常。blog

捕獲異常最簡單的語法格式以下:圖片

try:
	嘗試執行的代碼
except:
	出現錯誤的處理

try:嘗試,下方編寫要嘗試的不肯定是否可以正常執行的代碼。開發

except:若是不是,下方編寫提示錯誤的代碼。字符串

簡單的捕獲異常
print('簡單的捕獲異常')

while True:

    try:
        num = int(input('請輸入一個整數:'))
    except:
        print('請輸入有效的數字!')
        break

    print('-' * 9)
執行結果以下:
捕獲異常
請輸入一個整數:10
---------
請輸入一個整數:a
請輸入有效的數字!
針對錯誤類型捕獲異常

在程序執行時,可能會遇到不一樣類型的異常,而且須要針對不一樣類型的異常,作出不一樣的響應,這個時候就須要捕獲錯誤類型。input

針對錯誤類型捕獲異常的語法格式以下:io

try:
	# 嘗試執行的代碼
	pass
except 錯誤類型1:
	# 針對錯誤類型1,對應的代碼處理
	pass
except (錯誤類型2, 錯誤類型3):
	# 針對錯誤類型2和3,對應的代碼處理
	pass
except Exception as result:
	print('未知錯誤%s' % result)

當Python解釋器拋出異常時,最後一行錯誤信息的第一個單詞,就是錯誤類型。

在開發時,要預判到全部可能出現的錯誤,仍是有必定難度的。 若是但願程序不管出現任何錯誤,都不會由於拋出異常而被終止,則能夠增長一個未知錯誤的異常判斷。

針對錯誤類型捕獲異常
print('針對錯誤類型捕獲異常')

while True:

    try:
        num = int(input('請輸入一個整數:'))
        result = 8 / num
        print(result)
    except ValueError:
        print('傳入無效的參數!')
    except ZeroDivisionError:
        print('除0錯誤!')
        break

    print('-' * 9)
執行結果以下:
針對錯誤類型捕獲異常
請輸入一個整數:a
傳入無效的參數!
---------
請輸入一個整數:0
除0錯誤!
捕獲未知錯誤
print('捕獲未知錯誤')

while True:

    try:
        num = int(input('請輸入一個整數:'))
        result = 8 / num
        print(result)
    except ValueError:
        print('傳入無效的參數!')
    except Exception as e:
        print('未知錯誤:%s' % e)
        break

    print('-' * 9)
執行結果以下:
捕獲未知錯誤
請輸入一個整數:a
傳入無效的參數!
---------
請輸入一個整數:0
未知錯誤:division by zero
捕獲異常的完整語法

在實際開發中,爲了可以處理複雜的異常狀況,相應有一套完整的異常語法,語法格式以下:

try:
	# 嘗試執行的代碼
	pass
except 錯誤類型1:
	# 針對錯誤類型1,對應的代碼處理
	pass
except (錯誤類型2, 錯誤類型3):
	# 針對錯誤類型2和3,對應的代碼處理
	pass
except Exception as result:
	print('未知錯誤%s' % result)
else:
	# 沒有異常纔會執行的代碼
	pass
finally:
	# 不管是否有異常或是否捕獲了異常,finally子句都會保證執行
	pass
捕獲異常的完整語法
print('捕獲異常的完整語法')

while True:

    try:
        num = int(input('請輸入一個整數:'))
        result = 8 / num
        print(result)
    except ValueError:
        print('傳入無效的參數!')
    except Exception as e:
        print('未知錯誤:%s' % e)
    else:
        print('嘗試成功!')  # 沒有異常纔會執行
    finally:
        print('結束!')  # 不管有沒有異常都會執行

    print('-' * 9)
執行結果以下:
捕獲異常的完整語法
請輸入一個整數:8
1.0
嘗試成功!
結束!
---------
請輸入一個整數:a
傳入無效的參數!
結束!
---------
請輸入一個整數:0
未知錯誤:division by zero
結束!
異常的傳遞

當函數/方法執行出現異常,會將異常傳遞給函數/方法的調用一方,若是傳遞到主程序,仍然沒有異常處理,程序纔會被終止。

在開發中,能夠在主函數中增長異常捕獲;而在主函數中調用的其它函數,只要出現異常,都會傳遞到主函數的異常捕獲中;這樣就不須要在代碼中,增長大量的異常捕獲,可以保證代碼的簡潔。

異常的傳遞
def demo1():
    return int(input('請輸入一個整數:'))

def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print('請輸入有效的數字!')
except Exception as result:
    print('未知錯誤%s' % result)
執行結果以下:
請輸入一個整數:a
請輸入有效的數字!
主動拋出異常

在開發中,除了代碼執行出錯Python解釋器會拋出異常以外,還能夠根據應用程序特有的業務需求主動拋出異常。

Python中提供了一個 "Exception" 異常類,在開發時若是知足特定業務需求時,但願拋出異常,那麼應該首先建立一個 "Exception" 的對象,其次使用 "raise" 關鍵字拋出異常對象。

在這裏插入圖片描述

當前函數只負責提示用戶輸入密碼,若是密碼長度不正確,須要由其它的函數進行額外處理。

需求:

  1. 定義 "input_password" 函數,提示用戶輸入密碼
  2. 若是用戶輸入長度 < 8,拋出異常
  3. 若是用戶輸入長度 >= 8,返回輸入的密碼
主動拋出異常
def input_password():

    pwd = input('請輸入密碼:')  # 提示用戶輸入密碼

    if len(pwd) >= 8:  # 判斷密碼長度是否 >= 8,若是是則返回輸入的密碼
        return pwd

    print('主動拋出異常')

    ex = Exception('密碼長度小於8位數!')  # 建立異常對象,可使用錯誤信息字符串做爲參數
    raise ex  # 主動拋出異常

try:  # 捕獲異常
    print(input_password())
except Exception as result:
    print(result)
執行結果以下:
請輸入密碼:12345
主動拋出異常
密碼長度小於8位數!
相關文章
相關標籤/搜索