摘要:的異常處理錯誤的種類區分兩種錯誤可恢復和不可恢復錯誤。捕獲可恢復的錯誤幫助程序用于包裝一個操作,以便它可以捕獲錯誤并運行錯誤處理程序。相反,使用協同程序創建一個異常處理系統。
lapis的異常處理 錯誤的種類
Lapis 區分兩種錯誤:可恢復和不可恢復錯誤。 Lua 的運行時在執行期間拋出的錯誤或調用錯誤被認為是不可恢復的。 (這也包括 Lua 內置函數 assert )
因為不可恢復的錯誤不會被用戶捕獲,所以 Lapis 捕獲它們并向瀏覽器打印一個異常消息。任何已經運行的操作都可能會被中止,Lapis 將打印一個特殊視圖來顯示堆棧以及將 status 設置為 500。
這些類型的錯誤通常是一個 bug 或其他嚴重的問題,并且應該被修復。
可恢復的錯誤是用戶控制中止執行一個處理函數以運行指定錯誤處理函數的方式。它們使用協程而不是 Lua 的錯誤系統來實現。
比如來自用戶的無效輸入或數據庫中缺少的記錄。
捕獲可恢復的錯誤capture_errors 幫助程序用于包裝一個操作,以便它可以捕獲錯誤并運行錯誤處理程序。
它不捕獲運行時錯誤。如果你想捕獲運行時錯誤,你應該使用 pcall,就像你通常在 Lua中做的那樣。
Lua 沒有大多數其他語言的異常概念。相反,Lapis使用協同程序創建一個異常處理系統。我們使用 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))
當出現錯誤時會發生什么?該操作將在第一個錯誤處停止執行,然后運行錯誤處理程序。默認錯誤處理程序將在 self.errors 中設置一個類似數組的表,并返回 {render = true}。在您的視圖中,您可以顯示這些錯誤消息。這意味著如果你有一個命名的路由,那個路由的視圖將會被渲染。然后當出現一個 error 表時你應該編寫你自己的視圖。
如果你想有一個自定義的錯誤處理程序,你可以傳入一個 table 來調用capture_errors :(注意 self.errors 在自定義處理程序之前設置)
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 }))
當調用 capture_errors處理函數時將使用傳入的 table 的第一個位置值作為操作。
如果您正在構建 JSON API,lapis 則會提供另一個方法capture_errors_json,它會在 JSON 對象中呈現錯誤,如下所示:
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))
然后將呈現如下錯誤(請使用正確的content-type)
{ errors: ["something bad happened"] }assert_error
在 lua 中,當一個函數執行失敗時,習慣返回 nil 和一個錯誤消息。為此,提供了一個 assert_error 幫助程序。如果第一個參數是 falsey( nil 或 false),那么第二個參數作為一個錯誤被拋出,否則所有的參數都會從函數返回。
使用 assert_error 對于數據庫的方法非常方便。
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))
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39488.html
摘要:入門是為和編寫的框架。使用來安裝創建一個應用命令行工具附帶了一個命令行工具,可幫助您創建新項目和啟動服務器。在生產環境中,應當啟用緩存以獲得最佳性能。指令指定一個代碼塊,它將處理與其他不匹配的任何請求。將忽略常規的二進制文件。 lapis入門 Lapis 是為 Lua 和 MoonScript 編寫的 Web 框架。 Lapis 很有趣,因為它建立在Nginx 發行的 OpenRest...
摘要:配置及環境被設計于依據不同環境載入不同的配置來運行服務器。環境名稱僅影響加載的配置。例如,這里有一個的配置塊編譯時,首先檢查環境變量。默認日志記錄位置設置為,在默認的配置中指定。 配置及環境 Lapis 被設計于依據不同環境載入不同的配置來運行服務器。例如,可能您開發環境的配置設置為本地數據庫的URL,禁用代碼緩存和單個worker。然后,您生產環境的配置可能設定為遠程數據庫的 URL...
摘要:使用創建應用程序生成一個新項目如果您尚未閱讀,請閱讀入門指南,了解有關創建新項目骨架的信息以及,配置和命令的詳細信息。是包含應用程序的常規模塊。 使用Lua創建Lapis應用程序 生成一個新項目 如果您尚未閱讀,請閱讀入門指南,了解有關創建新項目骨架的信息以及OpenResty,Nginx配置和lapis命令的詳細信息。 您可以在當前目錄中通過運行以下命令啟動一個新的Lua項目: la...
摘要:配置語法配置示例的配置模塊提供了對遞歸合并的支持。例如,我們可以定義一個基本配置,然后覆蓋更多具體的配置聲明中的一些值這將產生以下兩個配置結果默認值省略您可以在相同的配置名稱上調用函數多次,每次將傳入的表合并到配置中。 Lua 配置語法 配置示例 Lapis 的配置模塊提供了對遞歸合并 table 的支持。 例如,我們可以定義一個基本配置,然后覆蓋更多具體的配置聲明中的一些值: --...
閱讀 1417·2021-11-09 09:45
閱讀 1785·2021-11-04 16:09
閱讀 1448·2021-10-14 09:43
閱讀 1814·2021-09-22 15:24
閱讀 1589·2021-09-07 10:06
閱讀 1596·2019-08-30 14:15
閱讀 980·2019-08-30 12:56
閱讀 1563·2019-08-29 17:22