2020年12月24日 星期四

Python 例外處理 Exception Handling

在程式設計中,

多少都會遇到錯誤,

這些錯誤發生的時候要做何種應對,

就得靠今天的主題:

Python 例外處理 Exception Handling

此處以 try ... exception .... 為範例來說明。

try:
tmpuser = User.objects.get(username=username)
if tmpuser.is_active:
messages.add_message(request, messages.ERROR, '密碼錯誤')
else:
messages.add_message(request, messages.ERROR, '帳號未啟用,請至註冊信箱收取認證信')
return redirect('Login')
except User.DoesNotExist:
messages.add_message(request, messages.ERROR, '無此帳號')
return redirect('Login')
上面是登入機制的一個例外處理範例,

當 User.DoesNotExist (該使用者不存在)的時候,

就顯示訊息 '無此帳號',

若要針對其他錯誤進行不同的動作,

繼續新增 except Exception: 即可,

官方文件針對 Built-in Exceptions 也有說明,

有興趣的話可以點擊進去看。


若為資料庫連線或者檔案處理中途發生了錯誤,

或者程式並沒有遇到錯誤,

而這些資源需要被釋放避免不必要的浪費,

可以透過 finally 讓程式最後無論如何都會執行此區塊中的程式碼,

不管是否有遇到錯誤,程式碼必然會執行 finally 區塊。

寫法可參考底下範例:
try:
tmpuser = User.objects.get(username=username)
if tmpuser.is_active:
messages.add_message(request, messages.ERROR, '密碼錯誤')
else:
messages.add_message(request, messages.ERROR, '帳號未啟用,請至註冊信箱收取認證信')
return redirect('Login')
except User.DoesNotExist:
messages.add_message(request, messages.ERROR, '無此帳號')
finally:
messages.add_message(request, messages.ERROR, '釋放資源')
return redirect('Home')

除了上述官方文件的 Built-in exceptions 之外,

也能夠自訂例外物件,

自訂的物件必須要繼承自Exception類別,

不過這屬於較為進階的用法,

在此處入門的教學就不多談論,

有機會的話再另行介紹。

沒有留言: