私はこのメソッドを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プロパティを使用していましたが、今は手掛かりがありません。
自動error
変数を使用して、必要に応じてNSError
にキャストできます。
catch {
let nsError = error as NSError
print(nsError.localizedDescription)
}
これで、ErrorType
を継承するオブジェクトをスローし、catch
文でカスタム処理を提供できます。エラーをNSError
にキャストして、サードパーティのエラーを処理するためにlocalizedDescription
にアクセスすることもできます。
EnumをキャストするとErrorType
はNSError
を生成します。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.)
質問のタイトルに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)
}