Erlang 在什么情况下,您会使用进程监视器而不是函数的try-catch

Erlang 在什么情况下,您会使用进程监视器而不是函数的try-catch,erlang,Erlang,我知道监管者可以监控很多进程,OTP监管者提供很好的默认值,比如如果X时间内有太多错误,那么就不要重试 我的问题是,您个人何时会选择try/catch而不是进程监视器。我更喜欢仅在抛出错误是正常行为的情况下使用try/catch,例如,在grpoc中使用lookup\u value/1(如果未注册密钥,则抛出badarg,而我希望并更喜欢得到未定义的) 这就是我所理解的Erlang哲学:你应该为好的情况编写程序,不要试图太过防御,也就是说,有些情况下你应该小心,而大多数情况下只是让它崩溃。我更喜

我知道监管者可以监控很多进程,OTP监管者提供很好的默认值,比如如果X时间内有太多错误,那么就不要重试


我的问题是,您个人何时会选择try/catch而不是进程监视器。

我更喜欢仅在抛出错误是正常行为的情况下使用try/catch,例如,在
grpoc
中使用
lookup\u value/1
(如果未注册密钥,则抛出badarg,而我希望并更喜欢得到
未定义的


这就是我所理解的Erlang哲学:你应该为好的情况编写程序,不要试图太过防御,也就是说,有些情况下你应该小心,而大多数情况下只是让它崩溃。

我更喜欢在抛出错误是正常行为的情况下使用try/catch,例如,
grpoc
中的
lookup\u value/1
(如果未注册密钥,它会抛出badarg,而我希望并更希望得到
未定义的


这就是我所理解的Erlang哲学:你应该为好的案例而编程,不要试图太过防御,也就是说,在某些情况下你应该小心,而在大多数情况下只是让它崩溃。

你所说的工具有两个完全不同的用例

您应该只在需要与其他事情并行进行的过程中运行事情。因此,我认为在等待结果的情况下(即顺序程序)需要捕获错误时,应该使用try/catch。当您需要并行运行某些东西时,应该使用外部进程,如果您对该进程中发生的异常感兴趣,则应该监视它

话虽如此,当然也有一些边缘案例,其中将活动外部化到流程中是有意义的,例如特殊的垃圾收集角落案例(通过杀死活动的流程来垃圾收集活动有时更容易/更快)


就性能而言,涉及的参数太多(try/catch与monitor的开销、代码运行的频率等),您必须为您的案例进行基准测试。

您所说的工具有两个完全不同的用例

您应该只在需要与其他事情并行进行的过程中运行事情。因此,我认为在等待结果的情况下(即顺序程序)需要捕获错误时,应该使用try/catch。当您需要并行运行某些东西时,应该使用外部进程,如果您对该进程中发生的异常感兴趣,则应该监视它

话虽如此,当然也有一些边缘案例,其中将活动外部化到流程中是有意义的,例如特殊的垃圾收集角落案例(通过杀死活动的流程来垃圾收集活动有时更容易/更快)

就性能而言,涉及的参数太多(try/catch与monitor的开销、代码运行的频率等),您必须针对您的案例进行基准测试