【问题标题】:Generate Error Sheet from Swift Exception从 Swift 异常生成错误表
【发布时间】:2016-09-11 16:44:56
【问题描述】:

我想从 Swift 异常处理程序生成一个 NSAlert 样式的错误表。过去使用 Objective-C 我可以简单地使用 [NSAlert alertWithError:] 现在使用 Swift 和它自己的异常处理系统,警报感觉相当笨拙:

enum Problems: ErrorType {
  case Bad
  case Worse
}

func f() throws {
  throw Problems.Worse
}

func g() {
  let errorMessage: String

  do {
    try f()
  }
  catch Problems.Bad {
    errorMessage = "This was bad"
  }
  catch Problems.Worse {
    errorMessage = "This was even worse"
  }
  catch {
    errorMessage = "This was unexpected"
  }

  guard errorMessage == nil else {
    let alert = NSAlert()
    alert.messageText = "Error"
    alert.informativeText = errorMessage
    alert.beginSheetModalForWindow(self, completionHandler: { [unowned self] (returnCode) -> Void in
      if returnCode == NSAlertFirstButtonReturn {
        // Handle the response
      }
    })
  }

这感觉很笨拙,并且如果必须检查许多错误条件,它就不能很好地扩展。有没有更好的办法?

【问题讨论】:

    标签: swift macos exception error-handling alert


    【解决方案1】:

    Swift 允许您的 ErrorType 拥有关联数据。这或多或少是来自NSErroruserInfo 的分解版本。如果想要方便,可以编写一个函数将Problems枚举转换为NSError

    enum Problems: ErrorType {
        case Small
        case Bad(message: String?)
        case Worse(message: String?)
    
        func toNSError() -> NSError {
            var errorMessage = ""
    
            switch self {
            case .Small:
                errorMessage = "Small error"
            case let .Bad(msg):
                errorMessage = msg ?? "Default bad message"
            case let .Worse(msg):
                errorMessage = msg ?? "Default worse message"
            }
    
            return NSError(domain: NSCocoaErrorDomain, code: 1, userInfo: [NSLocalizedDescriptionKey: errorMessage])
        }
    }
    
    func f() throws {
        throw Problems.Worse(message: nil)
    }
    
    
    do {
        try f()
    } catch let error as Problems {
        let err = error.toNSError()
        // now display NSAlert with err...
    }
    

    您可以使用message: nil 抛出错误以获取默认消息,或者根据本地条件添加您自己的自定义消息:

    throw Problems.Bad(message: "I have a bad feeling about this")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      相关资源
      最近更新 更多