如何在iOS应用中通过Sentry捕获401、403等HTTP状态码错误
iOS Sentry捕获401/403等HTTP状态码异常配置方案
Sentry默认不会自动捕获HTTP状态码类的业务异常,需要通过拦截请求或手动上报的方式实现,以下是两种可行方案:
方式一:基于原生URLSession的拦截器(推荐)
如果你的APP使用原生URLSession,可以通过继承SentryURLSessionDelegate来拦截请求响应,捕获指定状态码的错误:
- 自定义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) } }
- 给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
相关产品推荐
相关产品推荐

