// ...
};
// ...
}
异常处理
GameMaker 函数的结构通常是不抛出错误的 , 除非它肯定是你的错——所以 , 例如 , 试图打开一个不存在的文本文件将返回一个特殊的索引 -1, 但试图从一个无效的索引读取将抛出一个错误 。
不过 , 写允许失败的代码还是很方便的 , 不需要在过程的每一步插入安全检查 。 现在你可以了! 其工作原理如下 。
try{
// (可能引发错误的代码)
vara =1,b =0;
a =a div b;// 导致 "除以零 "的错误
show_debug_message("this line will not execute");
}catch(an_exception){
// 对错误信息做一些事情(或不做) , 这些信息是
// 现在存储在局部变量 an_exception 中 。
show_debug_message(an_exception);
}
"内置 "错误是带有几个变量的结构 。
- message : 一个字符串 , 包含对错误的简短描述 。 例如 , 如果你试图做整数除以 0, 它将是 "DoRem :: Divide by zero" 。
- longMessage : 一个对错误和 callstack 有较长描述的字符串 。 如果你不处理这个错误 , 这将出现在内置的错误弹出窗口 。
- Stacktrace : 表示调用堆栈的字符串数组 - 导致问题点的一连串函数名 。 当从 IDE 或使用 YYC 运行时 , 行号将包含在每个函数名之后(例如 gml__scr_hello (第 5 行)) 。
- : (技术上的)错误起源的脚本/函数的名称 。 这与抓取 stacktrace 中的第一项没有太大区别 。
try{
show_error ("hey",false);}catch(e){
show_debug_message(e.message);// "hey"
}
或通过使用 throw 关键字(允许任意的值被 "抛出") 。
try{
throw{
message :"hey",
longMessage :"no long messages today",
stacktrace :debug_get_callstack
}
}catch(e){
show_debug_message(e);// 输出上述 struct
}
Try-catch 块可以嵌套在同一个或不同的脚本中 。
当这种情况发生时 , 最近的捕获块将被触发 。
如果你不想处理一个异常 , 你可以“重新抛出”它 。
try{
try{
return10/a_missing_variable;
}catch(e){
if(string_pos("DoRem",e.message)!=0){
show_debug_message ("Caught `"+e.message +"` in inner catch!");
}else{
throwe;
}
}
}catch(e){
show_debug_message("Caught `"+e.message +"` in outer catch!");
}
如果一个异常没有被捕获 , 你会得到熟悉的错误弹出窗口 。 除非……
exception_unhandled_handler
在可以被认为是最后一道防线的情况下 , GMS2 现在还提供了一个函数 , 当一个异常没有被捕获 , 你的游戏即将关闭时 , 这个功能将被调用 。 这覆盖了默认的错误弹出窗口 。
exception_unhandled_handler(function(e){
show_message("Trouble!\n"+string(e.longMessage));
});
show_error("hey",true);
正如文档所指出的 , 在这一点上你能做的不多 , 但你可以将错误文本(连同任何可能证明有用的上下文)保存到一个文件中 , 这样你就可以在游戏开始时加载它 , 并为用户提供一个报告 。
较小的添加物
主要是便利功能 。
String functions
增加了 string_pos_ext 、 string_last_pos 和 string_last_pos_ext, 以处理从偏移量和/或从字符串末尾开始搜索子串的问题 , 这对解析数据很有帮助--例如 , 见我以前的“在分隔符上分割字符串”的帖子 。
Array functions
增加了一些数组函数来处理数组 。
array_resize(array, newsize) 这将一个数组的大小调整为新的大小 , 要么在数组的末尾添加零 , 要么删除元素以满足大小 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
