成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

lapis的異常處理

cucumber / 1509人閱讀

摘要:的異常處理錯(cuò)誤的種類(lèi)區(qū)分兩種錯(cuò)誤可恢復(fù)和不可恢復(fù)錯(cuò)誤。捕獲可恢復(fù)的錯(cuò)誤幫助程序用于包裝一個(gè)操作,以便它可以捕獲錯(cuò)誤并運(yùn)行錯(cuò)誤處理程序。相反,使用協(xié)同程序創(chuàng)建一個(gè)異常處理系統(tǒng)。

lapis的異常處理 錯(cuò)誤的種類(lèi)

Lapis 區(qū)分兩種錯(cuò)誤:可恢復(fù)和不可恢復(fù)錯(cuò)誤。 Lua 的運(yùn)行時(shí)在執(zhí)行期間拋出的錯(cuò)誤或調(diào)用錯(cuò)誤被認(rèn)為是不可恢復(fù)的。 (這也包括 Lua 內(nèi)置函數(shù) assert

因?yàn)椴豢苫謴?fù)的錯(cuò)誤不會(huì)被用戶(hù)捕獲,所以 Lapis 捕獲它們并向?yàn)g覽器打印一個(gè)異常消息。任何已經(jīng)運(yùn)行的操作都可能會(huì)被中止,Lapis 將打印一個(gè)特殊視圖來(lái)顯示堆棧以及將 status 設(shè)置為 500

這些類(lèi)型的錯(cuò)誤通常是一個(gè) bug 或其他嚴(yán)重的問(wèn)題,并且應(yīng)該被修復(fù)。

可恢復(fù)的錯(cuò)誤是用戶(hù)控制中止執(zhí)行一個(gè)處理函數(shù)以運(yùn)行指定錯(cuò)誤處理函數(shù)的方式。它們使用協(xié)程而不是 Lua 的錯(cuò)誤系統(tǒng)來(lái)實(shí)現(xiàn)。

比如來(lái)自用戶(hù)的無(wú)效輸入或數(shù)據(jù)庫(kù)中缺少的記錄。

捕獲可恢復(fù)的錯(cuò)誤

capture_errors 幫助程序用于包裝一個(gè)操作,以便它可以捕獲錯(cuò)誤并運(yùn)行錯(cuò)誤處理程序。

它不捕獲運(yùn)行時(shí)錯(cuò)誤。如果你想捕獲運(yùn)行時(shí)錯(cuò)誤,你應(yīng)該使用 pcall,就像你通常在 Lua中做的那樣。

Lua 沒(méi)有大多數(shù)其他語(yǔ)言的異常概念。相反,Lapis使用協(xié)同程序創(chuàng)建一個(gè)異常處理系統(tǒng)。我們使用 capture_errors 幫助程序來(lái)定義我們必須捕獲錯(cuò)誤的范圍。然后我們可以使用 yield_error 來(lái)拋出一個(gè)原始錯(cuò)誤。

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)錯(cuò)誤時(shí)會(huì)發(fā)生什么?該操作將在第一個(gè)錯(cuò)誤處停止執(zhí)行,然后運(yùn)行錯(cuò)誤處理程序。默認(rèn)錯(cuò)誤處理程序?qū)⒃?self.errors 中設(shè)置一個(gè)類(lèi)似數(shù)組的表,并返回 {render = true}。在您的視圖中,您可以顯示這些錯(cuò)誤消息。這意味著如果你有一個(gè)命名的路由,那個(gè)路由的視圖將會(huì)被渲染。然后當(dāng)出現(xiàn)一個(gè) error 表時(shí)你應(yīng)該編寫(xiě)你自己的視圖。

如果你想有一個(gè)自定義的錯(cuò)誤處理程序,你可以傳入一個(gè) table 來(lái)調(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ù)時(shí)將使用傳入的 table 的第一個(gè)位置值作為操作。

如果您正在構(gòu)建 JSON API,lapis 則會(huì)提供另一個(gè)方法capture_errors_json,它會(huì)在 JSON 對(duì)象中呈現(xiàn)錯(cuò)誤,如下所示:

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)如下錯(cuò)誤(請(qǐng)使用正確的content-type

{ errors: ["something bad happened"] }
assert_error

lua 中,當(dāng)一個(gè)函數(shù)執(zhí)行失敗時(shí),習(xí)慣返回 nil 和一個(gè)錯(cuò)誤消息。為此,提供了一個(gè) assert_error 幫助程序。如果第一個(gè)參數(shù)是 falseynilfalse),那么第二個(gè)參數(shù)作為一個(gè)錯(cuò)誤被拋出,否則所有的參數(shù)都會(huì)從函數(shù)返回。

使用 assert_error 對(duì)于數(shù)據(jù)庫(kù)的方法非常方便。

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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39488.html

相關(guān)文章

  • lapis請(qǐng)求處理

    摘要:處理函數(shù)的返回值用于渲染輸出。例如,如果不滿(mǎn)足某些條件,我們可以取消操作并重定向到另一個(gè)頁(yè)面是處理一個(gè)常規(guī)動(dòng)作的返回值,所以同樣的事情你可以返回一個(gè)動(dòng)作,可以傳遞給請(qǐng)求對(duì)象每個(gè)操作在調(diào)用時(shí)會(huì)請(qǐng)求對(duì)象作為其第一個(gè)參數(shù)傳遞。 lapis請(qǐng)求處理 每個(gè)被Lapis處理的HTTP請(qǐng)求在被Nginx處理后都遵循相同的基本流程。第一步是路由。路由是 url 必須匹配的模式。當(dāng)你定義一個(gè)路由時(shí),你也...

    Olivia 評(píng)論0 收藏0
  • lapis入門(mén)

    摘要:入門(mén)是為和編寫(xiě)的框架。使用來(lái)安裝創(chuàng)建一個(gè)應(yīng)用命令行工具附帶了一個(gè)命令行工具,可幫助您創(chuàng)建新項(xiàng)目和啟動(dòng)服務(wù)器。在生產(chǎn)環(huán)境中,應(yīng)當(dāng)啟用緩存以獲得最佳性能。指令指定一個(gè)代碼塊,它將處理與其他不匹配的任何請(qǐng)求。將忽略常規(guī)的二進(jìn)制文件。 lapis入門(mén) Lapis 是為 Lua 和 MoonScript 編寫(xiě)的 Web 框架。 Lapis 很有趣,因?yàn)樗⒃贜ginx 發(fā)行的 OpenRest...

    endless_road 評(píng)論0 收藏0
  • lapis配置及環(huán)境

    摘要:配置及環(huán)境被設(shè)計(jì)于依據(jù)不同環(huán)境載入不同的配置來(lái)運(yùn)行服務(wù)器。環(huán)境名稱(chēng)僅影響加載的配置。例如,這里有一個(gè)的配置塊編譯時(shí),首先檢查環(huán)境變量。默認(rèn)日志記錄位置設(shè)置為,在默認(rèn)的配置中指定。 配置及環(huán)境 Lapis 被設(shè)計(jì)于依據(jù)不同環(huán)境載入不同的配置來(lái)運(yùn)行服務(wù)器。例如,可能您開(kāi)發(fā)環(huán)境的配置設(shè)置為本地?cái)?shù)據(jù)庫(kù)的URL,禁用代碼緩存和單個(gè)worker。然后,您生產(chǎn)環(huán)境的配置可能設(shè)定為遠(yuǎn)程數(shù)據(jù)庫(kù)的 URL...

    sarva 評(píng)論0 收藏0
  • 創(chuàng)建Lapis應(yīng)用程序

    摘要:使用創(chuàng)建應(yīng)用程序生成一個(gè)新項(xiàng)目如果您尚未閱讀,請(qǐng)閱讀入門(mén)指南,了解有關(guān)創(chuàng)建新項(xiàng)目骨架的信息以及,配置和命令的詳細(xì)信息。是包含應(yīng)用程序的常規(guī)模塊。 使用Lua創(chuàng)建Lapis應(yīng)用程序 生成一個(gè)新項(xiàng)目 如果您尚未閱讀,請(qǐng)閱讀入門(mén)指南,了解有關(guān)創(chuàng)建新項(xiàng)目骨架的信息以及OpenResty,Nginx配置和lapis命令的詳細(xì)信息。 您可以在當(dāng)前目錄中通過(guò)運(yùn)行以下命令啟動(dòng)一個(gè)新的Lua項(xiàng)目: la...

    jzzlee 評(píng)論0 收藏0
  • lapis配置之 lua語(yǔ)法

    摘要:配置語(yǔ)法配置示例的配置模塊提供了對(duì)遞歸合并的支持。例如,我們可以定義一個(gè)基本配置,然后覆蓋更多具體的配置聲明中的一些值這將產(chǎn)生以下兩個(gè)配置結(jié)果默認(rèn)值省略您可以在相同的配置名稱(chēng)上調(diào)用函數(shù)多次,每次將傳入的表合并到配置中。 Lua 配置語(yǔ)法 配置示例 Lapis 的配置模塊提供了對(duì)遞歸合并 table 的支持。 例如,我們可以定義一個(gè)基本配置,然后覆蓋更多具體的配置聲明中的一些值: --...

    BaronZhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<