摘要:的異常處理錯誤的種類區(qū)分兩種錯誤可恢復(fù)和不可恢復(fù)錯誤。捕獲可恢復(fù)的錯誤幫助程序用于包裝一個操作,以便它可以捕獲錯誤并運行錯誤處理程序。相反,使用協(xié)同程序創(chuàng)建一個異常處理系統(tǒng)。
lapis的異常處理 錯誤的種類
Lapis 區(qū)分兩種錯誤:可恢復(fù)和不可恢復(fù)錯誤。 Lua 的運行時在執(zhí)行期間拋出的錯誤或調(diào)用錯誤被認(rèn)為是不可恢復(fù)的。 (這也包括 Lua 內(nèi)置函數(shù) assert )
因為不可恢復(fù)的錯誤不會被用戶捕獲,所以 Lapis 捕獲它們并向瀏覽器打印一個異常消息。任何已經(jīng)運行的操作都可能會被中止,Lapis 將打印一個特殊視圖來顯示堆棧以及將 status 設(shè)置為 500。
這些類型的錯誤通常是一個 bug 或其他嚴(yán)重的問題,并且應(yīng)該被修復(fù)。
可恢復(fù)的錯誤是用戶控制中止執(zhí)行一個處理函數(shù)以運行指定錯誤處理函數(shù)的方式。它們使用協(xié)程而不是 Lua 的錯誤系統(tǒng)來實現(xiàn)。
比如來自用戶的無效輸入或數(shù)據(jù)庫中缺少的記錄。
捕獲可恢復(fù)的錯誤capture_errors 幫助程序用于包裝一個操作,以便它可以捕獲錯誤并運行錯誤處理程序。
它不捕獲運行時錯誤。如果你想捕獲運行時錯誤,你應(yīng)該使用 pcall,就像你通常在 Lua中做的那樣。
Lua 沒有大多數(shù)其他語言的異常概念。相反,Lapis使用協(xié)同程序創(chuàng)建一個異常處理系統(tǒng)。我們使用 capture_errors 幫助程序來定義我們必須捕獲錯誤的范圍。然后我們可以使用 yield_error 來拋出一個原始錯誤。
local lapis = require("lapis") local app_helpers = require("lapis.application") local capture_errors, yield_error = app_helpers.capture_errors, app_helpers.yield_error local app = lapis.Application() app:match("/do_something", capture_errors(function(self) yield_error("something bad happened") return "Hello!" end))
當(dāng)出現(xiàn)錯誤時會發(fā)生什么?該操作將在第一個錯誤處停止執(zhí)行,然后運行錯誤處理程序。默認(rèn)錯誤處理程序?qū)⒃?self.errors 中設(shè)置一個類似數(shù)組的表,并返回 {render = true}。在您的視圖中,您可以顯示這些錯誤消息。這意味著如果你有一個命名的路由,那個路由的視圖將會被渲染。然后當(dāng)出現(xiàn)一個 error 表時你應(yīng)該編寫你自己的視圖。
如果你想有一個自定義的錯誤處理程序,你可以傳入一個 table 來調(diào)用capture_errors :(注意 self.errors 在自定義處理程序之前設(shè)置)
app:match("/do_something", capture_errors({ on_error = function(self) log_erorrs(self.errors) -- you would supply the log_errors function return { render = "my_error_page", status = 500 } end, function(self) if self.params.bad_thing then yield_error("something bad happened") end return { render = true } end }))
當(dāng)調(diào)用 capture_errors處理函數(shù)時將使用傳入的 table 的第一個位置值作為操作。
如果您正在構(gòu)建 JSON API,lapis 則會提供另一個方法capture_errors_json,它會在 JSON 對象中呈現(xiàn)錯誤,如下所示:
local lapis = require("lapis") local app_helpers = require("lapis.application") local capture_errors_json, yield_error = app_helpers.capture_errors_json, app_helpers.yield_error local app = lapis.Application() app:match("/", capture_errors_json(function(self) yield_error("something bad happened") end))
然后將呈現(xiàn)如下錯誤(請使用正確的content-type)
{ errors: ["something bad happened"] }assert_error
在 lua 中,當(dāng)一個函數(shù)執(zhí)行失敗時,習(xí)慣返回 nil 和一個錯誤消息。為此,提供了一個 assert_error 幫助程序。如果第一個參數(shù)是 falsey( nil 或 false),那么第二個參數(shù)作為一個錯誤被拋出,否則所有的參數(shù)都會從函數(shù)返回。
使用 assert_error 對于數(shù)據(jù)庫的方法非常方便。
local lapis = require("lapis") local app_helpers = require("lapis.application") local capture_errors, assert_error = app_helpers.capture_errors, app_helpers.assert_error local app = lapis.Application() app:match("/", capture_errors(function(self) local user = assert_error(Users:find({id = "leafo"})) return "result: " .. user.id end))
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/39488.html
摘要:入門是為和編寫的框架。使用來安裝創(chuàng)建一個應(yīng)用命令行工具附帶了一個命令行工具,可幫助您創(chuàng)建新項目和啟動服務(wù)器。在生產(chǎn)環(huán)境中,應(yīng)當(dāng)啟用緩存以獲得最佳性能。指令指定一個代碼塊,它將處理與其他不匹配的任何請求。將忽略常規(guī)的二進制文件。 lapis入門 Lapis 是為 Lua 和 MoonScript 編寫的 Web 框架。 Lapis 很有趣,因為它建立在Nginx 發(fā)行的 OpenRest...
摘要:配置及環(huán)境被設(shè)計于依據(jù)不同環(huán)境載入不同的配置來運行服務(wù)器。環(huán)境名稱僅影響加載的配置。例如,這里有一個的配置塊編譯時,首先檢查環(huán)境變量。默認(rèn)日志記錄位置設(shè)置為,在默認(rèn)的配置中指定。 配置及環(huán)境 Lapis 被設(shè)計于依據(jù)不同環(huán)境載入不同的配置來運行服務(wù)器。例如,可能您開發(fā)環(huán)境的配置設(shè)置為本地數(shù)據(jù)庫的URL,禁用代碼緩存和單個worker。然后,您生產(chǎn)環(huán)境的配置可能設(shè)定為遠程數(shù)據(jù)庫的 URL...
摘要:使用創(chuàng)建應(yīng)用程序生成一個新項目如果您尚未閱讀,請閱讀入門指南,了解有關(guān)創(chuàng)建新項目骨架的信息以及,配置和命令的詳細(xì)信息。是包含應(yīng)用程序的常規(guī)模塊。 使用Lua創(chuàng)建Lapis應(yīng)用程序 生成一個新項目 如果您尚未閱讀,請閱讀入門指南,了解有關(guān)創(chuàng)建新項目骨架的信息以及OpenResty,Nginx配置和lapis命令的詳細(xì)信息。 您可以在當(dāng)前目錄中通過運行以下命令啟動一個新的Lua項目: la...
摘要:配置語法配置示例的配置模塊提供了對遞歸合并的支持。例如,我們可以定義一個基本配置,然后覆蓋更多具體的配置聲明中的一些值這將產(chǎn)生以下兩個配置結(jié)果默認(rèn)值省略您可以在相同的配置名稱上調(diào)用函數(shù)多次,每次將傳入的表合并到配置中。 Lua 配置語法 配置示例 Lapis 的配置模塊提供了對遞歸合并 table 的支持。 例如,我們可以定義一個基本配置,然后覆蓋更多具體的配置聲明中的一些值: --...
閱讀 1489·2021-11-09 09:45
閱讀 1867·2021-11-04 16:09
閱讀 1518·2021-10-14 09:43
閱讀 1906·2021-09-22 15:24
閱讀 1711·2021-09-07 10:06
閱讀 1665·2019-08-30 14:15
閱讀 1060·2019-08-30 12:56
閱讀 1629·2019-08-29 17:22