错误处理和异常

简介: 错误处理和异常

对于大多数应用而言,我们无需在 Lua 代码中做任何错误处理,应用程序本身会负责处理这类问题。所有 Lua 语言的行为都是由应用程序的一次调用而触发的,这类调用通常是要求 Lua 语言执行一段代码。如果执行中发生了错误,那么调用会返回一个错误代码,以便应用程序采取适当的行为来处理错误。当独立解释器中发生错误时,主循环会打印错误信息,然后继续显示提示符,并等待执行指定的命令。


不过,如果要在 Lua 代码中处理错误,那么就应该使用函数 pcallprotected call)来封装代码。


假设要执行一段 Lua 代码并捕获执行中发生的所有错误,那么首先需要将这段代码封装到一个函数中,这个函数通常是一个匿名函数。之后,通过 pcall 来调用这个函数:

local ok, msg = pcall(function ()
  -- some code
  if unexpected_condition then error() end
  -- some code
  print(a[i])   -- 潜在错误:'a'可能不是一个表
  -- some code
  end)
if ok then      -- 执行被保护的代码时没有错误发生
  -- 常规代码
else            -- 执行被保护的代码时有错误发生:进行恰当的处理
  -- 错误处理代码
end


函数 pcall 会以一种保护模式来调用它的第 1 个参数,以便捕获该函数执行中的错误。无论是否有错误发生,函数 pcall 都不会引发错误。如果没有错误发生,那么 pcall 返回 true 及被调用函数(作为 pcall 的第 1 个参数传入)的所有返回值;否则,则返回 false错误信息


使用"错误信息"的命名方式可能会让人误解错误信息必须是一个字符串,因此称之为错误对象可能更好,这主要是因为函数 pcall 能够返回传递给 error 的任意 Lua 语言类型的值。

local status, err = pcall(function () error({code = 121}) end)
print(err.code)   --> 121


这些机制为我们提供了在 Lua 语言中进行异常处理的全部。我们可以通过 error 来抛出异常,然后用函数 pcall 来捕获异常,而错误信息则用来标识错误类型

目录
相关文章
|
8月前
|
Unix 程序员 C语言
C 错误处理
C 错误处理。
41 3
|
8月前
|
网络协议 网络安全 Python
Python网络编程基础(Socket编程) 错误处理和异常
【4月更文挑战第10天】网络编程涉及到很多复杂的操作和潜在的风险,如连接失败、数据丢失、超时等问题。因此,正确的错误处理和异常捕获是确保网络程序稳定性和可靠性的关键。本章将介绍网络编程中常见的错误和异常,并探讨如何在Python中进行有效的错误处理。
|
8月前
|
C++
C++ 捕获所有异常并拿到错误原因的方法
C++ 捕获所有异常并拿到错误原因的方法
247 0
|
8月前
|
中间件
Koa2 的错误处理机制是什么?如何捕获错误?
Koa2 的错误处理机制是什么?如何捕获错误?
185 0
|
8月前
|
安全 C++
C++中的异常处理与错误处理机制
C++中的异常处理与错误处理机制
102 0
|
5月前
|
PHP 开发者 UED
PHP编程中的错误处理与异常管理
【8月更文挑战第27天】在PHP编程的世界中,错误和异常是开发者常遇到的两大挑战。本文旨在通过浅显易懂的方式,引导读者理解如何在PHP代码中妥善处理错误和异常。我们将从基础的错误处理讲起,逐步深入到异常管理的高级技巧,确保你的代码在遇到问题时能够优雅地处理,而不是崩溃。文章将用实例说明如何捕获、记录和处理这些事件,以保障应用的稳定性和用户体验。
|
8月前
|
安全 Java 程序员
c错误处理
c错误处理
91 2
|
8月前
|
存储 C++
C++ 异常处理机制详解:轻松掌握异常处理技巧
C++ 异常处理提供结构化错误管理,增强程序健壮性。通过`throw`抛出异常,`try-catch`捕获并处理。示例展示了当年龄小于18时抛出异常。优点包括提高健壮性和代码可维护性,但可能降低性能并复杂化代码。另外,介绍了四种在C++中相加两个数的方法,包括使用运算符、函数、类、STL函数和lambda表达式。
93 0
|
8月前
|
存储 C++
C++中的异常处理与错误管理
C++中的异常处理与错误管理
51 0
C++中的异常处理与错误管理
|
8月前
|
C++
C++处理的异常的机制
C++处理的异常的机制