lapis的异常处理

lapis的异常处理

错误的种类

Lapis 区分两种错误:可恢复和不可恢复错误。 Lua 的运行时在执行期间抛出的错误或调用错误被认为是不可恢复的。 (这也包括 Lua 内置函数 assert数据库

由于不可恢复的错误不会被用户捕获,因此 Lapis 捕获它们并向浏览器打印一个异常消息。任何已经运行的操做均可能会被停止,Lapis 将打印一个特殊视图来显示堆栈以及将 status 设置为 500json

这些类型的错误一般是一个 bug 或其余严重的问题,而且应该被修复。api

可恢复的错误是用户控制停止执行一个处理函数以运行指定错误处理函数的方式。它们使用协程而不是 Lua 的错误系统来实现。数组

好比来自用户的无效输入或数据库中缺乏的记录。浏览器

捕获可恢复的错误

capture_errors 帮助程序用于包装一个操做,以便它能够捕获错误并运行错误处理程序。app

它不捕获运行时错误。若是你想捕获运行时错误,你应该使用 pcall,就像你一般在 Lua中作的那样。函数

Lua 没有大多数其余语言的异常概念。相反,Lapis使用协同程序建立一个异常处理系统。咱们使用 capture_errors 帮助程序来定义咱们必须捕获错误的范围。而后咱们可使用 yield_error 来抛出一个原始错误。ui

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 表时你应该编写你本身的视图。lua

若是你想有一个自定义的错误处理程序,你能够传入一个 table 来调用capture_errors :(注意 self.errors 在自定义处理程序以前设置)code

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 APIlapis 则会提供另外一个方法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 帮助程序。若是第一个参数是 falseynilfalse),那么第二个参数做为一个错误被抛出,不然全部的参数都会从函数返回。

使用 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))
相关文章
相关标签/搜索