Lua所遇到的任何未预期条件都会引发一个错误。因此在发生错误时不能简单的崩溃或着退出,而是结束当前程序块并返回应用程序。当错误引发时进行恰当的处理是最合适的,然而这个阶段伴随着错误的捕获、错误的处理、错误追溯等处理。Lua中有函数pcall、error、assert函数来操作错误。其中pcall用于捕获错误、error抛出一个错误、assert是error的包装。

 
一、抛出错误
 
     在Lua中抛出错误信息的函数是error,通常包含调用堆栈信息以及错误提示信息。而assert是error的包装,它有两个参数可选,第一个参数如果返回false,那么就引发错误,抛出错误提示信息第二个参数。因此使用assert要比error更为简便。
 
     两种方式都是可以的,而且可以自定义错误信息,简便快捷的跟踪错误位置及错误模块。
 
 
 
 
二、捕获及处理错误
 
     抛出错误会引发程序停止执行,那么如何在发现错误的情况下继续程序的运行呢?pcall函数为程序的异常处理提供了很好的支持,它让可能会发生错误的程序在安全的环境内执行,如果发生错误,那么程序不停止,可根据需要去调用自定义错误处理。
     pcall函数在以一种“安全模式”来调用它的第一个参数,它可以捕获函数执行中的任何错误,如果没有发生错误,那么返回true及函数调用的返回值,否则返回false及错误信息。当然错误信息不一定是一个字符串,还可以是lua中的任何值。
 
 
三、错误消息与追溯
 
     当错误发生时,如果需要能够追溯到发生错误时的函数调用情况即显示一个完整的函数调用栈,那么就要使用xpcall函数,因为pcall函数在返回其消息时,它已经销毁了调用栈的部分内容。xpcall函数除了接受一个被调用的函数以外,还有第二个参数,即错误处理函数。当错误发生时,Lua会在调用栈展开前调用错误处理函数。可以在处理函数中使用debug库来获取有关错误的额外信息,一个是debug.debug()函数,另一个是debug.traceback()函数,其中debug函数会提供一个Lua操作符( lua_debug> ),让用户来检查错误的原因。而traceback函数会根据调用栈来构建一个扩展错误消息,当然也可以在任何时候调用这个函数来获取当前的调用栈信息。
 

Lua 学习笔记(八)错误(error)的更多相关文章

  1. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  4. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  5. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  6. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  7. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  8. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  9. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  10. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

随机推荐

  1. About_Smarty

    Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一.它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码 ...

  2. javascript array sort()

    [5,10,1].sort(); 结果[1,10,5] 有点出人意料. array.sort( sortFunction )可选-指定如何比较元素顺序的函数名称 如果省略sortFunction参数, ...

  3. tornado web 框架的认识

    tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...

  4. Lua源代码阅读分析问题列表(转)

    最近正在阅读lua源码,遇到座灯塔,转载如下: 我个人的习惯是带着问题去研究一个新题目,比如这次阅读Lua代码,暂列下面这些问题. 1)什么是基于栈.基于寄存器的虚拟机(VM)设计?Lua如何实现基于 ...

  5. solr查询语句示例

    url示例:sort=id+desc&&fq=date_time:[20081001 TO 20091031]&wt=json&json.nl=map&q=st ...

  6. Android 6.0 使用HttpURLConnection 使用Get提交遇到405等问题。

    HttpURLConnection 在调用connection.setDoOutput(true)之后会自动把提交方式改为POST.然后调用方法的时候有可能会出现这种情况 在调用get的时候设置为co ...

  7. Unity3D 物体跟随鼠标旋转

    float speed=1000f; void Update () { if (Input.GetMouseButton (0)) { transform.Rotate (0,-Input.GetAx ...

  8. PHP基础知识之逻辑运算符

    与(and,&&)和或(or,||)有两种形式,两种形式的区别是:优先级不一样,and.or的优先级低于&&.||

  9. PHP 文件处理

    $handler = fopen('./abc.html', 'w'); if(!feof($handler)){ // 读取文件末尾,也可以用file_exists mkdir('./abc.htm ...

  10. 在windows上如何安装python web引擎jinja2

    首先要把你的Python文件夹加到环境变量里头去.假设你的Python文件夹位于C:\Python34,那么你需要打开CMD并输入: SETX PATH "%path%;C:\Python3 ...