资讯专栏INFORMATION COLUMN

lapis的异常处理

cucumber / 1469人阅读

摘要:的异常处理错误的种类区分两种错误可恢复和不可恢复错误。捕获可恢复的错误帮助程序用于包装一个操作,以便它可以捕获错误并运行错误处理程序。相反,使用协同程序创建一个异常处理系统。

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 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))

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39488.html

相关文章

  • lapis请求处理

    摘要:处理函数的返回值用于渲染输出。例如,如果不满足某些条件,我们可以取消操作并重定向到另一个页面是处理一个常规动作的返回值,所以同样的事情你可以返回一个动作,可以传递给请求对象每个操作在调用时会请求对象作为其第一个参数传递。 lapis请求处理 每个被Lapis处理的HTTP请求在被Nginx处理后都遵循相同的基本流程。第一步是路由。路由是 url 必须匹配的模式。当你定义一个路由时,你也...

    Olivia 评论0 收藏0
  • lapis入门

    摘要:入门是为和编写的框架。使用来安装创建一个应用命令行工具附带了一个命令行工具,可帮助您创建新项目和启动服务器。在生产环境中,应当启用缓存以获得最佳性能。指令指定一个代码块,它将处理与其他不匹配的任何请求。将忽略常规的二进制文件。 lapis入门 Lapis 是为 Lua 和 MoonScript 编写的 Web 框架。 Lapis 很有趣,因为它建立在Nginx 发行的 OpenRest...

    endless_road 评论0 收藏0
  • lapis配置及环境

    摘要:配置及环境被设计于依据不同环境载入不同的配置来运行服务器。环境名称仅影响加载的配置。例如,这里有一个的配置块编译时,首先检查环境变量。默认日志记录位置设置为,在默认的配置中指定。 配置及环境 Lapis 被设计于依据不同环境载入不同的配置来运行服务器。例如,可能您开发环境的配置设置为本地数据库的URL,禁用代码缓存和单个worker。然后,您生产环境的配置可能设定为远程数据库的 URL...

    sarva 评论0 收藏0
  • 创建Lapis应用程序

    摘要:使用创建应用程序生成一个新项目如果您尚未阅读,请阅读入门指南,了解有关创建新项目骨架的信息以及,配置和命令的详细信息。是包含应用程序的常规模块。 使用Lua创建Lapis应用程序 生成一个新项目 如果您尚未阅读,请阅读入门指南,了解有关创建新项目骨架的信息以及OpenResty,Nginx配置和lapis命令的详细信息。 您可以在当前目录中通过运行以下命令启动一个新的Lua项目: la...

    jzzlee 评论0 收藏0
  • lapis配置之 lua语法

    摘要:配置语法配置示例的配置模块提供了对递归合并的支持。例如,我们可以定义一个基本配置,然后覆盖更多具体的配置声明中的一些值这将产生以下两个配置结果默认值省略您可以在相同的配置名称上调用函数多次,每次将传入的表合并到配置中。 Lua 配置语法 配置示例 Lapis 的配置模块提供了对递归合并 table 的支持。 例如,我们可以定义一个基本配置,然后覆盖更多具体的配置声明中的一些值: --...

    BaronZhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<