如何正确地投掷并捕获Swift中的错误,以保持原始错误起源的原始堆栈跟踪

问题描述 投票:0回答:1

获取有意义的堆栈轨迹误差

能够在发生错误时向用户显示自定义错误消息(这意味着该应用不会崩溃ANS自身)。

    我创建了一个测试应用程序,该应用程序展示了可以处理错误的不同方式:
  1. struct TestSentryApp: App { init() { //Initialize Sentry SentrySDK.start { options in options.dsn = "SECRET_DSN_GOES_HERE" options.debug = false options.tracesSampleRate = 1.0 options.profilesSampleRate = 1.0 } } var body: some Scene { WindowGroup { ContentView() } } } //Define a custom error enum CustomError : Error { case validationError(message: String) case internalError(message: String, innerError: Error? = nil) } struct ContentView: View { var body: some View { VStack(alignment: .leading) { Text("Error Handling Tests") Button("Test A") { try! throwingFunction() } Button("Test B") { do { try throwingFunction() } catch { //We could show a message to the user here informing about the error here SentrySDK.capture(error: error) } } Button("Test C") { do { try wrappedErrorThrowingFunction() } catch { //We could show the message of the internalError here to the user, but still understand what happened because we have the innerError SentrySDK.capture(error: error) } } } } func throwingFunction() throws { throw CustomError.validationError(message: "Error thrown on purpose.") } func wrappedErrorThrowingFunction() throws { do { try throwingFunction() } catch { throw CustomError.internalError(message: "Unexpecetd error", innerError: error) } } }
  2. 按下每个按钮的行为以下方式:

ButtonA:没有执行错误的任何特殊处理,作为回报,我们会清楚地了解该错误,但应用程序崩溃了,因此用户没有获得有关出了什么问题的任何信息。
BUTTONB:捕获任何可能的错误,允许我们通知用户,但错误点的堆栈跟踪指向我们称之为错误的行,这是不正确的。
Buttonc:显示了另一种方法,在其中我们用自己的

SentrySDK.capture

包裹任何错误。这使我们能够向用户向InternalRor向用户显示消息,同时仍保留(和记录)内部设备进行调试。在Innererror包含我们不想向用户披露的路径或其他敏感信息的情况下,这是无罪的。
  • 那时的问题是: - 上面的凹痕的没有提供完整的堆栈跟踪,并带有错误的实际行,但对于按钮A中的代码,它会使应用程序崩溃。有什么办法可以始终获得完整的堆栈跟踪而无需崩溃? - 在审议原始堆栈跟踪时,我可以用自定义的错误包裹任何错误?
  • 提前感谢!
  • 	
  • 如果您只丢掉自己的错误,那么肯定
  • CustomError .internalError
    创建
  • struct CustomError: Error { let message: String let innerError: (any Error)? let callStack: [String] = Thread.callStackSymbols init(message: String, innerError: (any Error)? = nil) { self.message = message self.innerError = innerError } } func throwingFunction() throws { throw CustomError(message: "Error thrown on purpose.") } func wrappedErrorThrowingFunction() throws { do { try throwingFunction() } catch { throw CustomError(message: "Unexpecetd error", innerError: error) } }
时,将记录呼叫堆栈。您可以以这样的方式打印呼叫堆栈符号:

CustomError

有任何任意
swift swiftui error-handling
1个回答
0
投票
?那是不可能的。符合

Error

的唯一要求是
Error
。不需要包含任何调用堆栈信息。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.