【问题标题】:Catch exceptions due to parentheses/brackets/braces mismatch in Ruby捕获由于 Ruby 中的括号/括号/大括号不匹配而导致的异常
【发布时间】:2021-10-14 10:14:54
【问题描述】:

以下是使用 Ruby 计算 Excel 公式的代码。此处仅显示 SUM 函数。我用两种语言实现了这个功能RubyPython

Python 3.10.0

def SUM(a,b):
    return a+b
for i in range(int(input())):
    s=input()
    if s[0]!="=":
        print("INVALID")
    else:
        try:
            print(eval(s.replace('=','')))
         except:
            print("INVALID")

Ruby 3.0.2

def SUM a,b
    a+b
end

gets
puts $<.map{
    if !_1[/^=/]
        :INVALID
    else
        eval(_1.tr(?=,'')) rescue :INVALID
    end
}

考虑以下输入

输入 1

4
=SUM(8, 99)
=SUM(343, -b1)
=SUM(-8,  -99)
=SUM(101 , -25) + 6

输入 2

3
SUM(4, 1)
=SUM(5, 1
=SuM(2, 1)

对于输入 1,Ruby 和 Python 代码都可以完美运行。他们都捕获了错误b1 not defined,因此转到exceptrescue

但是对于输入 2,只有 Python 代码可以完美运行,而 Ruby 无法捕获错误 ) missing(在第 3 行)。它不会转到rescue。我也尝试使用beginresuce。但什么都没有。如何挽救 Ruby 中的此类错误?

【问题讨论】:

  • 我也看不出这对“评估 EXCEL 公式”有何帮助
  • 我想问一下如何像在Pyton中一样模拟tryexcept
  • 这不是try/except,实际的“问题”是为什么ruby 中的eval 不会像您期望的那样引发错误。我对 Ruby 不熟悉,但这是你应该问的。
  • 你的 Ruby 代码让我眼花缭乱。你能正确格式化吗?在那之后,也许解释一下你真正想要做什么。

标签: python ruby error-handling


【解决方案1】:

在 ruby​​ 中 rescue 默认只拯救 StandardError 的子类。这适用于大多数情况,因为您想要拯救的大多数东西都是该类的后代(NoMethodErrorRuntimeErrorArgumentError 等等),以及大多数您不想拯救的东西( NoMemoryErrorSyntaxErrorSystemExit 等)不是。

在您的情况下,eval("SUM(5, 1") 缺少括号。这是一个语法错误,ruby 引发SyntaxError。您的 rescue 正在寻找 StandardError,而 SyntaxError 不是。

您可以挽救所有标准错误 + 语法错误或挽救所有 Exceptions,但请注意,如果您挽救所有 Exceptions,那么您的程序可能难以退出。

ctrl+cInterrupt,是Exception 的子类,可以解救。

进程上的kill是一个SignalException,是Exception的子类,可以抢救。

begin
  eval(_1.tr(?=,''))
rescue StandardError, SyntaxError
  :INVALID
end

begin
  eval(_1.tr(?=,''))
rescue Exception # I strongly advise against this
  :INVALID
end

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多