在Ruby中捕获异常而不是StandardError,并重新引发它

在Ruby中捕获异常而不是StandardError,并重新引发它,ruby,Ruby,这是我们不应该做的: rescue Exception 但至少要使用: rescue StandardError 因为否则,我们也可能捕捉到一些信号,例如,这些信号旨在合法终止我们的程序 但是呢 ... rescue Exception => e begin # Just in case I get another exception when writing the log mylogfile.puts("Exception #{e} occured") rescu

这是我们不应该做的:

rescue Exception
但至少要使用:

rescue StandardError
因为否则,我们也可能捕捉到一些信号,例如,这些信号旨在合法终止我们的程序

但是呢

... 
rescue Exception => e
  begin # Just in case I get another exception when writing the log
    mylogfile.puts("Exception #{e} occured")
  rescue Exception
  end
  raise e
end
...

这是否也应该被视为危险?毕竟,我提出了同样的异常,而且我的日志中有一些发生了什么的证据。

log和throw通常被认为是个坏主意。当程序崩溃时,它会将详细信息打印到标准输出。这还不够吗?除了上面所有的注释,你怎么会怀疑你的代码在OutOfMemory上打印日志消息?@Sergio Tulentsev:当然可以将stderr和stdout重定向到某个文件,但是将消息放在日志文件中更方便。@mudasobw:这不是问题。在这种情况下,日志记录也会引发异常。这将被忽略,然后执行raise。这将把异常写入stderr,然后,正如Sergio Tulentsev所观察到的,它也可以被观察到。只是在大多数情况下,原始异常不会影响日志记录,它会出现在日志文件中。