Elixir的函数可以在异常情况下停止执行并显示堆栈跟踪信息。我们来看看如何抛出异常和恢复异常。重写Shop模块:
在try代码块里,我们编写了愉快路径代码。愉快路径是仅处理成功场景的代码。rescue代码块里面是处理错误的代码。在rescue块中,对于每一行,我们应该提供一个用于匹配的异常结构体和一个代码块。如果模式匹配失败,将引发MatchError异常,然后rescue中的模式匹配表达式列表将尝试匹配异常并执行代码块。如果模式匹配表达式都没有匹配到被抛出的异常,Elixir将再次抛出该异常。
我们来试试验这个策略。在lib/dungeon_crawl/cli/invalid_option.ex中创建一个异常结构体,因为恢复MatchError异常不是最佳解决方案。MatchError太宽泛了,最好使用明确的错误结构体澄清问题。
我们用指令defexception创建我们的异常结构体。我们使用可选消息提供了一条默认错误消息:“Invalid option”。你可以在Elixir官方文档中查看函数defexception和行为Exception的详细信息。[1]现在,当用户输入无效数字或不存在的选项时,我们可以引发此异常。转到Dungeon-Crawl.CLI.BaseCommands并编写parse_answer/1和find_option_by_index/2,如下所示:(www.xing528.com)
我们在parse_answer!/1和find_option_by_index!/2中使用流程控制技巧来抛出函数的错误。raise函数需要一个异常结构体。调用raise后,它会停止函数的执行。如果未使用rescue,程序将停止并显示堆栈跟踪信息。现在让我们用try和rescue编写ask_for_option/1函数:
在try代码块中,我们创建了函数管道的愉快路径。在rescue块中,我们匹配DungeonCrawl.CLI.InvalidOptionError并将结构体放在变量e中。我们使用display_error/1函数来显示错误消息。我们还使用递归调用要求用户再次尝试。你可以运行mix start查看效果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。