问: 标题可能太大了,答案可能是“取决于”吗?但是,提供一些实际案例/示例应帮助像我这样的开发人员认识到何时应用。我将从我的特殊情况开始。您还是不使用自定义错误类?为什么/为什么不呢?

以下示例如下一个示例受到欢迎,例如何时使用自己的错误类。我真的很想知道。

前任: 我正在使用 httparty 查询我们的Rails Web服务应用程序中的某些数据。它使用基本身份验证。我将粘贴测试代码和实施。我的测试应该期待什么, Runtimeerror 或者 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

实施:

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
有帮助吗?

解决方案

在大多数情况下,我会 绝不 拯救或筹集RuntimeError. 。这可能与您的代码完全无关。最好使用自定义例外。

通常,只要您在库的常数中命名空间,就可以将错误调用。例如,如果有人错误地弄错了他们的用户名,您可能会有 YourApp::InvalidUsername 作为这样定义的例外对象:

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

结尾

当你 raise YourApp::InvalidUsername 您会看到该消息出现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top