此问题已在此处有答案:
How to create an exit message(3个答案)
Ruby check whether program is currently being closed(1个答案)
昨天关门了。
我想向STDOUT
或STDERR
中为用户写入一条干净、简单的错误消息,而不需要(冗长的)回溯。我目前使用raise
来编写错误消息并退出,如以下简化示例所示:
#!/usr/bin/env ruby
def bar
raise "this needs to be clean, no backtrace"
end
bar
它将以下内容写入STDERR
:
/Users/foo/test/test1.rb:4:in `bar': this needs to be clean, no backtrace (RuntimeError)
from /Users/foo/test/test1.rb:7:in `<main>'
我只想写这一部分:
this needs to be clean, no backtrace
真实的示例有一个详细得多的回溯,以及多个raise
语句,用于处理带有定制消息的不同故障模式。
我知道我可以这样做(对于干净的STDOUT
),但我想避免重复的代码:
puts "this needs to be clean, no backtrace"
raise "this needs to be clean, no backtrace"
相关:
- Unhandled Exceptions in Ruby-这个答案建议了一种比我需要的更复杂的处理异常的方法(即捕获和打印错误消息)。我只需要:(a)
raise
-或类似的东西-立即终止程序,(B)只打印错误消息,而不是完整的堆栈跟踪或回溯,这会让我们的用户感到困惑。
2条答案
按热度按时间xfb7svmp1#
如果你只想输出到stderr,你可以使用
warn
(或者直接写入$stderr
),也许沿着exit
:要改变全局异常处理程序的工作方式,您可以注册一个
at_exit
处理程序,它检查异常类,打印其消息并使stdout静默以抑制回溯。就像这样:将这种错误处理设置为可选的可能是一个好主意。
7y4bm7vi2#
你是否试图重写Ruby向STDERR写入未捕获异常的方式?我不知道这是否容易做到(或可取)。
你可以在一个自定义异常中覆盖回溯,这不会影响其他任何东西。