Lua学习教程之 捕获异常(tryCatch封装)

当我们的Lua程序遇到有需要保护的代码或者方法时(即使程序异常,也只是抛出异常信息,而不是让程序崩溃),Lua为我们提供了两种解决的办法,这两种方法可以让我们捕获异常,因此封装自己的tryCatch函数。

1.pcall调用

2.xpcall调用

相同点:

当程序正常时,返回true,被执行函数的返回值

不同点:

1.参数不同

pcall(fun) ,参数只有一个被调用函数

xpcall(fun,errHandleFun),参数是被调用函数,错误函数处理

2.执行结果

pcall:返回错误信息时,已经释放了保存错误发生情况的栈信息。

xpcall:会在栈信息释放之前调用错误处理程序(可以使用debug库收集错误信息)

3.返回结果

pcall 返回 nil , 错误信息

xpcall返回nil ,   无错误信息

实例:

local fun=function ( ... )
	local a=1;
	print(a+1);
	return a+1;
end

tryCatch=function(fun)
	local ret,errMessage=pcall(fun);
	print("ret:" .. (ret and "true" or "false" )  .. " \nerrMessage:" .. (errMessage or "null"));
end

xTryCatchGetErrorInfo=function()
	print(debug.traceback());
end
xTryCatch=function(fun)
	local ret,errMessage=xpcall(fun,xTryCatchGetErrorInfo);
	print("ret:" .. (ret and "true" or "false" )  .. " \nerrMessage:" .. (errMessage or "null"));
end

print("\n------A------\n")
tryCatch(fun);

print("\n------B------\n")

xTryCatch(fun);
print("\n------C------\n")

执行结果:

注释函数fun的第二行 local a=1;则打印如下结果:

时间: 2024-11-04 03:18:00

Lua学习教程之 捕获异常(tryCatch封装)的相关文章

Lua学习教程之 可变参数数据打包与解包

利用table的pack与unpack进行数据打包与解包,测试代码如下: print("Test table.pack()----------------"); function printTable ( t ) if type(t) == "table" then for k,v in pairs(t) do printTable(v); end else print(t); end end local packData =function( ... ) loca

Lua简明教程

这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),而且能和C语言非常好的互动.我很好奇得浏览了一下Lua解释器的源码,这可能是我看过最干净的C的源码了. 我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

【ExtJS 4.x学习教程】(4)组件(Components)

作者:周邦涛(Timen) Email:[email protected] 转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details/27366477 1. 简介 一个Ext JS 应用的UI是由一个或多个叫做组件(Component)的小部件组成的.所有的组件都是Ext.Component的子类,Ext.Component可以使其子类参与自动化的声明周期管理,包括初始化.渲染.调整大小及位置和销毁.Ext JS提供了大量的直接可用的组

【Java的JNI快速学习教程】

1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究). 解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发. 2. JNI快速学习教程 2.1 问题: 使用JNI写一段代码,实现string_Java_Test_helloworld

Python学习教程:必须掌握的Cookie知识点都在这里了

今天我们来全面了解一下Cookie(小饼干)相关的知识!篇幅有点长,在学习Python的伙伴或者有兴趣的你,可以耐心看哦! 相信很多同学肯定听过Cookie这个东西,也大概了解其作用,但是其原理以及如何设置,可能没有做过web的同学并不是非常清楚,以前的Python学习教程中其实有跟大家提到过,那今天就带大家详细了解下Cookie相关的知识! 一.诞生背景 爬虫系列教程的第一篇:HTTP详解中我们便说过HTTP的五大特点,而其中之一便是:无状态 HTTP无状态:服务器无法知道两个请求是否来自同一

Python学习教程:WEB开发——Python WSGI协议详解

Web应用程序开发 Web应用程序的本质是什么 简单描述Web应用程序的本质,就是我们通过浏览器访问互联网上指定的网页文件展示到浏览器上. 流程如下图: 从更深层次一点的技术角度来看,由以下几个步骤: 浏览器,将要请求的内容按照HTTP协议发送服务端 服务端,根据请求内容找到指定的HTML页面 浏览器,解析请求到的HTML内容展示出来 HTTP协议的全称是HyperText Transfer Protocol(超文本传输协议) HTTP协议是我们常用的五层协议中的应用层(5层从上到下是应用层,传

java学习教程之代码块

学编程吧java学习教程之代码块发布了,欢迎通过xuebiancheng8.com来访问 java中的代码块包括下面几种: 1.普通代码块 2.构造代码块 3.静态代码块 1.普通代码块很简单看下面这个例子: public class Test{ public static void main(String args[]){ { //此处就是普通代码块,普通代码块中的代码按顺序执行 System.out.println("hello"); } } } 2.构造代码块 public cl

Deep Learning 深度学习 学习教程网站集锦

http://blog.sciencenet.cn/blog-517721-852551.html 学习笔记:深度学习是机器学习的突破 2006-2007年,加拿大多伦多大学教授.机器学习领域的泰斗Geoffrey Hinton和他的学生RuslanSalakhutdinov在<科学>以及在Neural computation 和 NIPS上发表了4篇文章,这些文章有两个主要观点: 1)多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类: 2