昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后…然后就没有看书了。(小若:借口!借口!

今天来聊聊错误处理吧。只是毕竟这仅仅是前面的章节。书上的内容似乎有点一笔带过的味道。

没关系,简单更好~

笨木头花心贡献,哈?花心?不,是用心~

转载请注明,原文地址: http://www.benmutou.com/archives/1728

文章来源:笨木头与游戏开发

1.红色警报——error

我们应该能常常看到相似下面的错误信息:

[LUA-print] LUA ERROR: [string "src/main.lua"]:108: [string "src/main.lua"]:89: attempt to index global ‘a’ (a nil value)

这是在发生错误时给我们的提示,通常,这代表我们的代码不能继续正常运行下去了。

但你有知不知道,我们能够伪造这样的错误。没错。主动调用error函数,就会出现这样的信息。

例如以下代码:

  1. error("你的智商不多了,赶紧歇息,恢复一下吧");

然后,运行,输出例如以下信息:

[LUA-print] LUA ERROR: [string "src/main.lua"]:109: [string "src/main.lua"]:96: 你的智商不多了,赶紧歇息。恢复一下吧

这太厉害了。以后你看谁不爽,就往他代码里塞上这句话吧。比方在项目上线前塞进去~

言归正传,当我们在调用一个函数之前。能够先推断即将传递的參数是否正常,假设不正常,我们就能够选择直接抛出error,方便写代码的过程中发现问题。

比方下面的代码:

  1. local name = io.read();
  2. if name ~= "笨木头" then
  3. error("你是一个非常善良有爱心的人,我非常喜欢你..所以,去死吧!");
  4. end

仅仅要发现输入的内容不是“笨木头”,就狠狠地抛出异常。

2.偷个懒——assert

相似刚刚那种推断错误的代码。似乎有点啰嗦,于是,我们能够用assert取代形如if not then的代码。

比方上面的代码改为:

  1. local name = io.read();
  2. local result = assert(name == "笨木头", "你是一个非常善良有爱心的人,我非常喜欢你..所以,去死吧。");

假设assert的第一个參数为不为false。则返回第一个參数的值;否则,运行error函数,输出错误信息。错误信息的内容为assert的第二个參数。

输出结果和之前是一样的~

3.捕获错误代码——pcall

假设在发生错误时,我们不希望代码停止运行,而是做一些紧急措施。那么。能够使用pcall捕获错误。

例如以下面代码:

  1. function test()
  2. print(a[1]);
  3. end
  4. if pcall(test) then
  5. print("正常,呵呵");
  6. else
  7. print("哎。函数出错了。我正在帮你处理。放心吧,等我睡醒就...不是。等你睡醒就没事了~");
  8. end

函数test运行的时候肯定会报错的,由于并不存在a这个table。

使用pcall调用test函数,假设test不报错。则pcall返回ture,否则,返回false。

利用这个特性,我们就能够捕获异常,做一些紧急处理。

运行代码, 输出结果例如以下:

[LUA-print] 哎。函数出错了,我正在帮你处理。放心吧,等我睡醒就…不是,等你睡醒就没事了~

这紧急处理的方式还挺不错的,呵呵。

(小若:不错你个头啊!

这和没处理有区别吗?)

pcall除了会返回true或者false外。还能返回函数的错误信息,例如以下代码:

  1. function test()
  2. print(a[1]);
  3. end
  4. local status, err = pcall(test);
  5. if status then
  6. print("正常。呵呵");
  7. else
  8. print("哎,函数出错了,我正在帮你处理,放心吧。等我睡醒就...不是,等你睡醒就没事了~");
  9. print(err);
  10. end

pcall的第一个返回值和之前一样,true或者false。

而第二个參数则是test函数抛出的错误信息。运行代码。结果例如以下:

[LUA-print] 哎,函数出错了,我正在帮你处理,放心吧,等我睡醒就…不是,等你睡醒就没事了~
[LUA-print] [string "src/main.lua"]:94: attempt to index global ‘a’ (a nil value)

4.结束

关于错误处理,好像没有什么好玩的东西。所以,就写这么多吧~

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【本·伍德Lua专栏】补充的基础06:简单的错误处理的更多相关文章

  1. 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串

    近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...

  2. 【笨木头Lua专栏】基础补充04:迭代器初探

    今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...

  3. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  4. javascript基础06

      javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...

  5. Lua脚本之语法基础快速入门

    要 1.基本数据类型 2.Lua中的常用语句结构以及函数 3.Lua中的常用语句结构介绍 4.Lua中的库函数 目录[-] 一.基本数据类型 二.Lua中的常用语句结构以及函数 1.Lua中的常用语句 ...

  6. Flask基础(06)-->视图常用逻辑

    Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...

  7. mysql数据库基础的简单操作指南

    最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...

  8. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  9. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

随机推荐

  1. css3 menu 手机菜单3

    首先看一下效果图; 效果1,主要是 scale(0) -->scale(1px);opacity:0;—>opacity: 1; 然后递归延迟 怕麻烦也可以自己写个for循环 .five ...

  2. 博客搬到了http://xianglong.me

    自己用Django建立个人博客.这个博客的部分已经迁移到新的个人博客. 博客地址:龙 (http://xianglong.me),欢迎. 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  3. 具体解释首页被K后SEOer必做的三大排除方法!

    近段时间.有非常多朋友向新辰抱怨说出大问题了,为神马site不到首页了,并且收录变成了0?唉,新辰不得不非常同情的告诉你:你的首页真的被K了!好了.作为一个职业SEOer.面对被K宛如已经看破红尘般没 ...

  4. document.all使用

    document.all 一个. document.all它是在页面中的所有元素的集合.例如:      document.all(0)一个元素 二. document.all能够推断浏览器是否是IE ...

  5. php形式的内容被处理

    /** * 过滤HTML内容RETURN * * @param $string * @param bool $html * * @return array|string */ public stati ...

  6. 每天收获一点点------Hadoop概述

    一.Hadoop来历 Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明了倒排索引算法,通过加入了Map ...

  7. 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)

    JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  8. 《python源代码分析》笔记 pythonVM一般表达式

    本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.字节码指令 LOAD_CONST:从consts表中读取序号为i的元素并压入到执行时栈中 ...

  9. printf 对齐

      printf关于对其的问题(参考有关博客加上自己的一些总结) 1.关于左对齐或右对齐问题, 默认的如果%后没有“-”是右对齐的,如果%后跟“0”,不足的个数用0来填充, 例如:printf(&qu ...

  10. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   ...