def _run(args: nil, reraise_errors: false)
      if args.nil? && que_target
        args = que_target.que_attrs.fetch(:args)
      end

      run(*args)
      default_resolve_action if que_target && !que_target.que_resolved
    rescue => error
      raise error unless que_target

      que_target.que_error = error

      run_error_notifier =
        begin
          handle_error(error)
        rescue => error_2
          Que.notify_error(error_2, que_target.que_attrs)
          true
        end

      Que.notify_error(error, que_target.que_attrs) if run_error_notifier
      retry_in_default_interval unless que_target.que_resolved

      raise error if reraise_errors
    end
def _run(args: nil, reraise_errors: false)
      if args.nil? && que_target
        args = que_target.que_attrs.fetch(:args)
      end

      run(*args)
      default_resolve_action if que_target && !que_target.que_resolved
    rescue => error
      raise error unless que_target

      que_target.que_error = error

      run_error_notifier =
        begin
          handle_error(error)
        rescue => error_2
          Que.notify_error(error_2, que_target.que_attrs)
          true
        end

      Que.notify_error(error, que_target.que_attrs) if run_error_notifier
      retry_in_default_interval unless que_target.que_resolved

      raise error if reraise_errors
    end
Note that we delegate almost all methods to the result of the que_target
 method, which could be one of a few things, depending on the circumstance.
 Run the job with error handling and cleanup logic. Optionally support
 overriding the args, because it's necessary when jobs are invoked from
 ActiveJob.