web-dev-qa-db-ja.com

Swift 2.0でエラーメッセージを取得するにはどうすればよいですか?

私はこのメソッドをSwift 1.2:NSURLConnection.sendSynchronousRequest(:_:_:_)で非常に使用しましたが、これは明らかにiOS9では非推奨です。ただし、引き続き機能しますが、新しいSwift 2.0エラー処理と、それが失敗した場合、たとえば時間がなくなった場合にエラーメッセージをどのように受け取るかわかりません。

私はそれをdo-catchに入れてから、methoの前にtryと言う必要があることを知っていますが、エラーメッセージをキャッチする方法がわかりません。

do {
    let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    return data 
}
catch _ {
    return nil
}

以前はNSErrorを使用してから、そのdescriptionプロパティを使用していましたが、今は手掛かりがありません。

19
Arbitur

自動error変数を使用して、必要に応じてNSErrorにキャストできます。

catch {
    let nsError = error as NSError
    print(nsError.localizedDescription)
}
36
rshev

これで、ErrorTypeを継承するオブジェクトをスローし、catch文でカスタム処理を提供できます。エラーをNSErrorにキャストして、サードパーティのエラーを処理するためにlocalizedDescriptionにアクセスすることもできます。

EnumをキャストするとErrorTypeNSErrorを生成します。domainはenum名に等しく、codeはenum値に等しく、自動生成されたlocalizedDescriptionは次の形式です。

操作を完了できませんでした。 (ドメインエラーコード。)

たとえば、次のコード:

enum AwfulError: ErrorType {
    case Bad
    case Worse
    case Terrible
}

func throwingFunction() throws {
    throw AwfulError.Worse
}

do {
    try throwingFunction()
}
catch AwfulError.Bad {
    print("Bad error")
}
catch let error as NSError {
    print(error.localizedDescription)
}

印刷します

操作を完了できませんでした。 (AwfulErrorエラー1.)

4
redent84

質問のタイトルにSwift 2と指定されているにもかかわらず、この回答はSwift 3。

@ redent84が指摘しているように、Swift 2であるため、Errorオブジェクトは自家製のオブジェクトである可能性があります。ここに、 "catch"ステートメントで使用可能なデフォルトのエラーオブジェクトを分析および出力するために記述したメソッドがあります。特定のエラータイプを指定していません:

   // Method to print an unknown Error type object to the system output.
   static func printCaughtError(_ unknownError : Error) {
      let objectDescription = String(describing: unknownError)
      let localizedDescription = unknownError.localizedDescription
      if localizedDescription != "" {
         if localizedDescription.contains(objectDescription) {
            print(localizedDescription)
            return
         }
         if !objectDescription.contains(localizedDescription) {
            print(objectDescription + ": " + localizedDescription)
            return
         }
      }
      print(objectDescription)
   }

その後、次のように呼び出すことができます。

    catch {
       printCaughtError(error)
    }
1
RenniePet