You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在被Worker调用的Service类中抛出Bad Request触发TypeError问题

问题解决:Ruby中raise触发TypeError的修复方案

错误原因

你触发的TypeError: exception class/object expected是因为Ruby的raise方法要求传入异常类、异常实例或字符串,直接传哈希(:status => :bad_request)不符合参数要求,所以报错。

正确实现方式

方式1:自定义业务异常类(推荐)

先定义一个带状态码的自定义异常,方便上层统一处理:

# 在项目中定义自定义异常类(比如放在app/exceptions/missing_parameters_error.rb)
class MissingParametersError < StandardError
  attr_reader :status

  def initialize(message = "缺失必要参数", status = :bad_request)
    super(message)
    @status = status
  end
end

# 在Service中抛出异常
if response.success?
  log_messaging(200, response.status)
else
  raise MissingParametersError.new
end

之后在调用Service的Worker或上层逻辑中捕获异常,返回400状态:

begin
  # 调用Service逻辑
  YourService.new.process_data(params)
rescue MissingParametersError => e
  # 根据场景处理返回,比如API接口返回400
  render status: e.status, json: { error: e.message }
end

方式2:使用Rails内置异常(若基于Rails框架)

如果是Rails项目,可以直接抛出框架内置的ActionController::BadRequest异常:

if response.success?
  log_messaging(200, response.status)
else
  raise ActionController::BadRequest, "缺失必要参数"
end

Rails会自动识别该异常,返回400 Bad Request状态(需确保异常处理机制配置正确)。

方式3:简单抛出带信息的标准异常

如果不需要自定义属性,也可以直接用StandardError带错误信息,上层解析后设置状态:

if response.success?
  log_messaging(200, response.status)
else
  raise StandardError.new("status:bad_request, message:缺失必要参数")
end

捕获时解析消息内容设置状态:

begin
  YourService.new.call
rescue StandardError => e
  if e.message.include?("status:bad_request")
    render status: 400, json: { error: "缺失必要参数" }
  else
    # 处理其他异常
    raise e
  end
end

内容的提问来源于stack exchange,提问作者Kumar Nikhil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:15:02