Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception handling 如果任何光纤遇到异常,是否有办法退出该过程?_Exception Handling_Crystal Lang - Fatal编程技术网

Exception handling 如果任何光纤遇到异常,是否有办法退出该过程?

Exception handling 如果任何光纤遇到异常,是否有办法退出该过程?,exception-handling,crystal-lang,Exception Handling,Crystal Lang,现在我有两条带环路的光纤: spawn { begin loop { } rescue e : MyType end } 我在它们中使用begin/rescue来捕获异常、打印消息并退出流程。是否有一种方法可以指定只捕获一次,以捕获整个运行程序中的任何异常,而不是在每个不同的光纤中重复使用begin/rescue。如果您需要执行其他操作,则必须捕获光纤体内的异常。这实际上是我的一个大问题。如果我正在使用的库生成了一个线程,并且它得到了一个未处理的异常,那么我对此无能为力。这

现在我有两条带环路的光纤:

spawn {
  begin
    loop { }
  rescue e : MyType
  end
}

我在它们中使用
begin/rescue
来捕获异常、打印消息并退出流程。是否有一种方法可以指定只捕获一次,以捕获整个运行程序中的任何异常,而不是在每个不同的光纤中重复使用
begin/rescue
。如果您需要执行其他操作,则必须捕获光纤体内的异常。

这实际上是我的一个大问题。如果我正在使用的库生成了一个线程,并且它得到了一个未处理的异常,那么我对此无能为力。这会使程序处于未定义、中断的状态。在许多用例中,致命错误是一个更好的选择。您是否有一个具体的示例,说明碎片产生的光纤使程序处于未定义状态?故事时间:几天前,我报告了在使用
amqp.cr
时遇到的错误。。SSL套接字在读取/写入0字节数据包时抛出错误。发生这种情况时,读卡器线程将停止接收字节,并占用一个完整的CPU。每次都得杀了它。最糟糕的是,线程有异常处理程序,但rescue块在试图打印应用程序回溯时(!)崩溃(无法打开可执行文件?)。。复杂,对吧?你不可能把一切都修好。但即使是一个全局错误处理程序也至少可以关闭应用程序。这个具体的例子听起来像是碎片实现中的一个缺陷。但当然,正确的错误处理将有助于避免此类问题。实际上,我一直在研究一个将结构化并发引入Crystal的方案。我将很快发布RFC。不,问题在于
ex.backtrace
抛出了一个完全无法预料的错误。这就是重点;您不可能在每个场景中都涵盖所有内容——即使异常也可能有异常。真正的解决办法是改变crystal,使其能够根据应用程序尽可能优雅地处理此问题。GUI程序应该弹出一个错误对话框。web守护进程可能会崩溃,等等。。处理每种情况的唯一方法是改进线程错误处理。即使能够覆盖默认的事件循环处理程序,也会有很大的帮助。