gpt4 book ai didi

ruby-on-rails - Rails 错误处理;报告,自定义错误

转载 作者:行者123 更新时间:2023-12-03 08:53:17 24 4
gpt4 key购买 nike

我正在寻找一种更好的方法来处理错误,我们通常编写代码来接受要在成功的结果中完成的 block 。我颠倒了这个想法,并写了下来:

class SomeVeryBigReportObjectOnWhatWentWrong
# contains attributes to help format a nice report for humans
# comes up with a nice backtrace
# writes to rails log
# writes to error aggregator (External site)
# maybe writes to slack depending on error
# Records the error in another log for developers to view
# dances and twirls too.
end

class MyTest
def can?(test, &block)
return true if test

if block_given?
error_report = SomeVeryBigReportObjectOnWhatWentWrong.new("error message for starters")
yield error_report
end

return false
end
end

class MyController < ApplicationController

def action
page = Page.find(params[:id])
obj = MyTest.new

# obj.can?(:read, page)
return unless obj.can?(false) { | big_error_report |
big_error_report.context = .... # about 15 lines of this....

flash[:error] = big_error_report.message
redirect_to big_error_report.default_error_page
}

# back to our regular successful outcomes...

end
end

这段代码的优点是错误处理是缩进的,让人们很容易看到什么是错误报告,它可以从周围的代码中提取很多上下文,并且可以很好地自定义错误报告。

让下一个程序员的生活更轻松: http://blog.codinghorror.com/the-noble-art-of-maintenance-programming/

代码的缺点是,当我查看它时,我的第一个“想法”是

“返回”,除非“这是错误的”?呃?什么是 block ? - 使困惑 -

这段代码有味道吗?

最佳答案

我的感觉是:

  • 功能 can?做两件事:检查条件是否运行测试并运行一个 block 。但实际上,您可能只需要其中的 1 个。此外,当您返回 false ,您想为该值做什么,控制外部逻辑?
  • &block作为显式参数发送,但我们没有使用它
  • 函数名称不清楚。

  • 如果我重构这个:(先说清楚)
    class MyTest
    def run_report
    if block_given?
    yield SomeVeryBigReportObjectOnWhatWentWrong.new("error message for starters")
    else
    # Handle by default
    end
    end
    def can_report?(test)
    # FIXME: I think you're gonna do something here to proceed test
    test
    end
    end

    class MyController < ApplicationController

    def action
    obj = MyTest.new

    if obj.can_report?(false)
    obj.run_report { | big_error_report |
    big_error_report.context = .... # about 15 lines of this....

    flash[:error] = big_error_report.message
    redirect_to big_error_report.default_error_page
    }
    return
    end

    # back to our regular successful outcomes...
    end
    end

    关于ruby-on-rails - Rails 错误处理;报告,自定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531613/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com