Rails 中的错误模式,引发“文本评估运行时错误”或引发 MyModule::CustomError?

发布于 2024-09-25 03:07:02 字数 1793 浏览 3 评论 0原文

问:标题可能是一个太大的问题,答案可能是“视情况而定”?然而,提供一些实际案例/示例应该可以帮助像我这样的开发人员认识何时应用什么。我将从我的具体情况开始。您是否会使用自定义错误类?为什么/为什么不呢?

欢迎使用下面的其他示例,例如当您使用自己的错误类时。我真的很想知道。

例如:我正在使用 httparty 来查询我们的 Rails Web 服务应用程序中的一些内容数据。它使用基本身份验证。我将粘贴测试代码和实现。我的测试应该期待什么,RuntimeErrorSomeCustomError

class MyIntegrationTest < Test::Unit::TestCase
  context "connecting to someapp web service" do
    should "raise not authorized if username is wrong" do
      #get default MyWebserviceInterface instance, overriding username setting
      ws_endpoint = build_integration_object(:username => 'wrong_username')          
      assert_raises RuntimeError do  #TODO error design pattern?
        ws_endpoint.get
      end

    end
  end
end

实施:

class MyWebserviceInterface
  include HTTParty

  #Basic authentication and configurable base_uri
  def initialize(u, p, uri)
    @auth = {:username => u, :password => p}
    @uri = uri
  end

  def base_uri
    HTTParty.normalize_base_uri(@uri)
  end

  def get(path = '/somepath.xml', query_params = {})
    opts = {:base_uri => base_uri, :query => query_params, :basic_auth => @auth}        
    response = self.class.get(path, opts)
    evaluate_get_response(response)
    response.parsed_response
  end

  def evaluate_get_response(response)
  code = response.code
  body = response.body
  if code == 200
    logger.debug "OK - CREATED code #{code}"
  else
    logger.error "expected code 200, got code #{code}. Response body: #{body}"
    #TODO error design pattern? raise the above logged msg or a custom error?
    raise SomeAppIntegration::Error(code, body)
  end
end

Q: The title is perhaps too big of question and the answer probably is "it depends"? However, providing some practical cases/examples should help developers, like myself, recognize when to apply what. I'll start out with my particular situation. Would you or would you not use custom error classes? Why/why not?

Other examples as the one below are welcomed, like when you would use your own error classes. I really am wondering.

Ex: I'm using httparty to query our rails web service app for some data. It uses basic authentication. I'll paste both test code and implementation. What should my test expect, RuntimeError or SomeCustomError?

class MyIntegrationTest < Test::Unit::TestCase
  context "connecting to someapp web service" do
    should "raise not authorized if username is wrong" do
      #get default MyWebserviceInterface instance, overriding username setting
      ws_endpoint = build_integration_object(:username => 'wrong_username')          
      assert_raises RuntimeError do  #TODO error design pattern?
        ws_endpoint.get
      end

    end
  end
end

The implementation:

class MyWebserviceInterface
  include HTTParty

  #Basic authentication and configurable base_uri
  def initialize(u, p, uri)
    @auth = {:username => u, :password => p}
    @uri = uri
  end

  def base_uri
    HTTParty.normalize_base_uri(@uri)
  end

  def get(path = '/somepath.xml', query_params = {})
    opts = {:base_uri => base_uri, :query => query_params, :basic_auth => @auth}        
    response = self.class.get(path, opts)
    evaluate_get_response(response)
    response.parsed_response
  end

  def evaluate_get_response(response)
  code = response.code
  body = response.body
  if code == 200
    logger.debug "OK - CREATED code #{code}"
  else
    logger.error "expected code 200, got code #{code}. Response body: #{body}"
    #TODO error design pattern? raise the above logged msg or a custom error?
    raise SomeAppIntegration::Error(code, body)
  end
end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2024-10-02 03:07:02

在大多数情况下,我永远不会拯救或引发RuntimeError。这可能与您的代码完全无关。最好使用自定义异常。

一般来说,您可以根据需要调用任何错误,只要您在库常量中命名它们即可。例如,如果有人的用户名错误,您可以将 YourApp::InvalidUsername 作为异常对象,其定义如下:

module YourApp
  class InvalidUsername < StandardError
    def message
      super("Yo dawg, you got your username wrong all up in here")
    end
  end

end

当您 raise YourApp::InvalidUsername 时,您将会看到该消息出现。

In most cases, I would never rescue from or raiseRuntimeError. That could be something completely unrelated to your code. It's best to use a custom exception.

Generally, you can call errors whatever you want as long as you namespace them within your library's constant. For example, if someone gets their username wrong you could have YourApp::InvalidUsername as an exception object which would be defined like this:

module YourApp
  class InvalidUsername < StandardError
    def message
      super("Yo dawg, you got your username wrong all up in here")
    end
  end

end

When you raise YourApp::InvalidUsername you'll see that message appear.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文