如何在Erlang中抛出异常?

aka*_*nuk 5 erlang exception

我是Erlang的新手,我找到了如何处理用户指南中的异常,但没有找到如何抛出它们.是否可以定义然后抛出我自己的异常?

Pre*_*ias 4

这是来自引发 Erlang 异常的情况

\n

引发 Erlang 异常的示例exit(Why)

\n
-module(exceptions).\n\n-export([sample_error/0]).\n\nsample_error() -> throw(\xe2\x80\x9csome bad happened\xe2\x80\x9d).\n
Run Code Online (Sandbox Code Playgroud)\n
\n

现在让我们编译异常模块,调用sample_error()函数并观察引发的异常的输出。

\n
\n
erlc \xe2\x80\x93o ebin src/exceptions.erl\nerl \xe2\x80\x93pa ebin\n\n1> exceptions:sample_error().\n** exception throw: "some bad happened"\n  in function  exceptions:sample_error/0\n
Run Code Online (Sandbox Code Playgroud)\n

  • 即使脱离文本,这个答案也是**错误的**。`throw/1` 不会生成异常,它会执行非本地返回。生成的错误是没有任何东西可以捕获已抛出的值。使用 `exit/1` 或 `error/1` 来生成异常。 (5认同)
  • @RichardC 是的,用今天的术语来说可能是这样,但它们并不表现为例外。例如,除非没有捕获,否则抛出不会生成真正的异常。我认为你使用“抛出”、“退出”或“错误”中的哪一个应该清楚地表明意图。 (3认同)
  • @rvirding,用当今 Erlang 的术语来说,抛出只是另一种异常。(毕竟,它与退出和错误的机制相同。)将其称为非本地返回更多的是如何在程序中使用异常的问题。 (2认同)
  • 那么,什么是“真正的例外”?throw 仍然是一个异常(表明它应该被用户代码捕获的意图);如果没有被捕获,它只会转变为另一种异常(错误)。我对异常的定义是“由异常机制传播的东西,而不是正常的返回值”,并且所有错误/退出/抛出都符合此描述。它们的行为基本相同,只是不同类别的异常。 (2认同)