「來不及解釋了」,直接上代碼。html
from django.shortcuts import render, redirect from models import Hosts from django import forms # Create your views here. def database_error(request, message): if message == '' or message is None: message = 'Error detail is not given.' context = { 'database_error': message, } return render(request, 'exception/error.html', context) def database_error_decorator(func): from functools import wraps from django.utils.decorators import available_attrs def decorator(view_func): @wraps(view_func, assigned=available_attrs(view_func)) def _wrapped_view(request, *args, **kwargs): try: return view_func(request, *args, **kwargs) except Exception as e: return database_error(request, message=e.message) return _wrapped_view return decorator(func) @database_error_decorator def list_hosts(request): hosts = Hosts.objects.order_by('-hosts_hosts') context = { 'hosts': hosts } return render(request, 'inventory/hosts/list_hosts.html', context)
若是由於數據庫鏈接異常或者數據庫上的緣由致使view沒法獲取數據庫中的內容所產生的報錯若是直接打印給用戶,則用戶可能一頭霧水,用戶體驗很不友好。所以若是可能的話能夠在應用啓動前一個簡單的自檢,檢查數據庫是否能夠正常鏈接等,可是這種檢查通常不夠細緻到檢查數據庫中的某個表某個column是否存在,那麼是時候該捕獲一下這些異常了。python
若是每個view中的每個與數據庫相關的def都去重複捕獲這些異常,顯然不是一個很好的作法。一個比較好的作法就是使用裝飾器來捕獲這些異常。裝飾器的寫法徹底能夠參照「from django.contrib.auth.decorators import login_required」中的寫法,本文的例子也是參照這一寫法。其實每個種編程學習起來都是類似的,不管是Shell仍是Python,自帶的方法中給出了不少好的示例供咱們學習,不重複製造輪子,站在巨人的肩膀上能看的更遠!數據庫
tag:裝飾器捕獲異常,裝飾器,異常django
--end--編程