程序难免出错。这一章教你:出错时主动报错,以及兜住错误不让程序崩溃。
发现自己处理不了的情况,用 抛出 喊停,带上一条说明:
函数 安全除法(甲, 乙)
如果 乙 == 0
抛出 "除数不能是零"
返回 甲 / 乙
抛出 后面跟一段说明(文字或任何值),这段说明会原样出现在捕获它的 错 里。抛出 的别名是 报错。抛出后程序立刻停下,除非有人「捕获」——没接住的话会报 CN0311。
不想让一个错误搞崩整个程序,就把它包在 尝试 里,用 捕获 接住:
尝试
设 商 = 安全除法(10, 0)
打印(商)
捕获 错
打印("算不了:" + 错)
尝试 里的代码正常跑捕获,错 就是错误说明捕获 里的内容就跳过捕获 的别名是 出错时。
不关心错误到底是什么时,捕获 后面可以不写变量:
尝试
整数("abc")
捕获
打印("那不是数字")
有些收尾的事(关文件、清理)无论成败都要做,放 最后:
尝试
打印("开始")
抛出 "出错了"
捕获 错
打印("捕获:" + 错)
最后
打印("清理完成(无论成败都执行)")
最后 段保证执行——哪怕 尝试 里 返回 了、或错误继续往上抛,最后 都会先跑完。适合放关文件、清理这类收尾。
最后 的别名是 无论如何。
「文字转数字」可能失败,用异常包住就能给个默认值:
函数 安全转数(文字, 默认 = 0)
尝试
返回 整数(文字)
捕获 错
返回 默认
打印(安全转数("42")) # 42
打印(安全转数("abc")) # 0(转不了,给默认)
完整的例子见 示例/16-安全计算器.cnp。
捕获 能接住运行中出的错——除以零、类型不对、下标越界、转换失败、库调用出错、以及你自己 抛出 的。但语法错误不行:那是程序还没开始跑就发现的,抓不住。
写一个 安全转数 函数:尝试 整数(文字),失败就返回 -1,然后分别打印 安全转数("100") 和 安全转数("你好")。
函数 安全转数(文字)
尝试
返回 整数(文字)
捕获 错
返回 -1
打印(安全转数("100")) # 100
打印(安全转数("你好")) # -1
示例/ 目录,每个都能 cnp 运行