提问人:Timur Shtatland 提问时间:5/15/2023 最后编辑:Timur Shtatland 更新时间:5/18/2023 访问量:196
编写一条没有回溯的简单错误消息 [duplicate]
Write a simple error message without a backtrace [duplicate]
问:
我想为用户写入一个或一个干净、简单的错误消息,而没有(详细的)回溯。我目前正在使用编写错误消息并退出,如以下简化示例所示: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"
相关:
- Ruby 中未处理的异常 - 这个答案建议了一种比我需要的更复杂的处理异常的方法(即捕获和打印错误消息)。我所需要的只是:(a) - 或类似的东西 - 立即终止程序,以及 (b) 只打印错误消息,而不是全栈跟踪或回溯跟踪,这让我们的用户感到困惑。
raise
答:
2赞
Stefan
5/16/2023
#1
如果你只想输出到 stderr,你可以使用 warn
(或直接写入),也许与 exit
一起:$stderr
def bar
warn "this needs to be clean, no backtrace"
exit(false)
end
bar
若要更改全局异常处理程序的工作方式,可以注册一个at_exit
处理程序,该处理程序检查异常类,打印其消息并使 stdout 静音,以抑制回溯。像这样的东西:
class SimpleError < StandardError ; end
at_exit do
if $!.is_a?(SimpleError)
$stderr.puts($!.message)
$stderr.reopen(IO::NULL)
end
end
def bar
raise SimpleError, "this needs to be clean, no backtrace"
end
bar
将这种错误处理设置为可选可能是个好主意。
1赞
Arctodus
5/16/2023
#2
您是否正在尝试重写 Ruby 将未捕获的异常写入 STDERR 的方式?我不知道这是否容易做到(或可取)。
但是,您可以在自定义异常中覆盖回溯,这不会影响其他任何内容。
class ExceptionWithoutBacktrace < StandardError
def backtrace
[]
end
end
raise ExceptionWithoutBacktrace, "This should be printed clean"
评论
0赞
Timur Shtatland
5/16/2023
谢谢!很有意思。您提出的解决方案有什么缺点吗?
3赞
Arctodus
5/16/2023
在某些情况下,您实际上希望回溯跟踪可用
评论
raise
die(message)
puts message; exit
abort
at_exit
Kernel#exit