ruby 写一个简单的错误消息,不带回溯[重复]

1l5u6lss  于 2023-05-17  发布在  Ruby
关注(0)|答案(2)|浏览(72)

此问题已在此处有答案

How to create an exit message(3个答案)
Ruby check whether program is currently being closed(1个答案)
昨天关门了。
我想向STDOUTSTDERR中为用户写入一条干净、简单的错误消息,而不需要(冗长的)回溯。我目前使用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)只打印错误消息,而不是完整的堆栈跟踪或回溯,这会让我们的用户感到困惑。
xfb7svmp

xfb7svmp1#

如果你只想输出到stderr,你可以使用warn(或者直接写入$stderr),也许沿着exit

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

将这种错误处理设置为可选的可能是一个好主意。

7y4bm7vi

7y4bm7vi2#

你是否试图重写Ruby向STDERR写入未捕获异常的方式?我不知道这是否容易做到(或可取)。
你可以在一个自定义异常中覆盖回溯,这不会影响其他任何东西。

class ExceptionWithoutBacktrace < StandardError
  def backtrace
    []
  end
end

raise ExceptionWithoutBacktrace, "This should be printed clean"

相关问题