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

如何在iOS应用中通过Sentry捕获401、403等HTTP状态码错误

iOS Sentry捕获401/403等HTTP状态码异常配置方案

Sentry默认不会自动捕获HTTP状态码类的业务异常,需要通过拦截请求或手动上报的方式实现,以下是两种可行方案:


方式一:基于原生URLSession的拦截器(推荐)

如果你的APP使用原生URLSession,可以通过继承SentryURLSessionDelegate来拦截请求响应,捕获指定状态码的错误:

  1. 自定义URLSession代理类,重写响应处理方法
import Sentry

class CustomURLSessionDelegate: SentryURLSessionDelegate {
    override func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
        // 先执行父类逻辑,保证Sentry默认追踪流程正常
        super.urlSession(session, dataTask: dataTask, didReceive: response, completionHandler: completionHandler)
        
        // 筛选4xx范围内的状态码(可自定义需要捕获的码值)
        guard let httpResponse = response as? HTTPURLResponse, 
              (400...499).contains(httpResponse.statusCode) else {
            return
        }
        
        // 构建Sentry事件并上报
        let event = Event(level: .error)
        event.message = SentryMessage(formatted: "HTTP请求错误:状态码\(httpResponse.statusCode)")
        event.extra = [
            "请求URL": dataTask.currentRequest?.url?.absoluteString ?? "",
            "状态码": httpResponse.statusCode,
            "响应头": httpResponse.allHeaderFields
        ]
        
        SentrySDK.capture(event: event)
    }
}
  1. 给URLSession设置自定义代理
let customDelegate = CustomURLSessionDelegate()
let session = URLSession(configuration: .default, delegate: customDelegate, delegateQueue: nil)

方式二:网络请求回调中手动上报

如果使用第三方网络库(如Alamofire)或自定义网络层,可直接在请求回调中判断状态码并上报:

以Alamofire为例:

import Alamofire
import Sentry

AF.request("https://your-api-domain.com/path").response { response in
    guard let statusCode = response.response?.statusCode, 
          [401, 403].contains(statusCode) else {
        return
    }
    
    let event = Event(level: .error)
    event.message = SentryMessage(formatted: "HTTP请求错误:状态码\(statusCode)")
    event.extra = [
        "请求URL": response.request?.url?.absoluteString ?? "",
        "状态码": statusCode,
        "响应内容": String(data: response.data ?? Data(), encoding: .utf8) ?? ""
    ]
    
    SentrySDK.capture(event: event)
}

可选:精细化控制上报事件

在Sentry初始化时,可通过beforeSend回调过滤或修改上报的事件,比如只保留401、403:

SentrySDK.start { options in
    options.dsn = "your-dsn-value"
    options.debug = true 
    options.tracesSampleRate = 1.0
    options.diagnosticLevel = SentryLevel.debug
    options.enableCoreDataTracking = true
    
    options.beforeSend = { event in
        // 仅上报401和403状态码的事件
        guard let statusCode = event.extra?["状态码"] as? Int, 
              [401, 403].contains(statusCode) else {
            return nil
        }
        return event
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:36:23