您好,登錄后才能下訂單哦!
“來不及解釋了”,直接上代碼。
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)
如果因?yàn)閿?shù)據(jù)庫連接異?;蛘邤?shù)據(jù)庫上的原因?qū)е聉iew無法獲取數(shù)據(jù)庫中的內(nèi)容所產(chǎn)生的報(bào)錯(cuò)如果直接打印給用戶,則用戶可能一頭霧水,用戶體驗(yàn)很不友好。因此如果可能的話可以在應(yīng)用啟動(dòng)前一個(gè)簡(jiǎn)單的自檢,檢查數(shù)據(jù)庫是否可以正常連接等,但是這種檢查一般不夠細(xì)致到檢查數(shù)據(jù)庫中的某個(gè)表某個(gè)column是否存在,那么是時(shí)候該捕獲一下這些異常了。
如果每一個(gè)view中的每一個(gè)與數(shù)據(jù)庫相關(guān)的def都去重復(fù)捕獲這些異常,顯然不是一個(gè)很好的做法。一個(gè)比較好的做法就是使用裝飾器來捕獲這些異常。裝飾器的寫法完全可以參照“from django.contrib.auth.decorators import login_required”中的寫法,本文的例子也是參照這一寫法。其實(shí)每一個(gè)種編程學(xué)習(xí)起來都是相似的,無論是Shell還是Python,自帶的方法中給出了很多好的示例供我們學(xué)習(xí),不重復(fù)制造輪子,站在巨人的肩膀上能看的更遠(yuǎn)!
tag:裝飾器捕獲異常,裝飾器,異常
--end--
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。