2016-02-20 5 views
0

В обработке ошибок Swift - откуда вы знаете, какой тип ошибки вызывается, не глядя на реализацию, и как вы обрабатываете случай, когда ошибка, вызванная ошибкой ErrorType, и NSError может быть выбрана метод?Обработка ошибок Swift - определение типа ошибки

например.

Код не показывает, какую ошибку будет выдавать.

public func decode(jwt: String) throws -> JWT { 
    return try DecodedJWT(jwt: jwt) 
} 
+1

по крайней мере, для части вашего вопроса, то здесь может быть ответ: http://stackoverflow.com/a/ 30720807/5189361 – SalDev

ответ

3

Вы можете поймать заброшенную ошибку переменной и провести анализ времени выполнения переменной. Например, для некоторой неизвестной реализации:

/* ---------------------- */ 
/* unknown implementation */ 
enum HiddenError: ErrorType { 
    case SomeError 
} 

class AnotherError : NSError { } 

func foo() throws -> Int { 
    let foo = arc4random_uniform(3); 
    if foo == 0 { 
     throw HiddenError.SomeError 
    } 
    else if foo == 1 { 
     throw AnotherError(domain: "foo", code: 0, userInfo: [:]) 
    } 
    else if foo == 2 { 
     throw NSError(domain: "foo", code: 0, userInfo: [:]) 
    } 
    else { 
     return Int(foo) 
    } 
} 
/* ---------------------- */ 

Исследовать ошибку, как:

/* "External" investigation */ 
func bar() throws -> Int { 
    return try foo() 
} 

func fuzz() { 
    do { 
     let buzz = try bar() 
     print("Success: got \(buzz)") 
    } catch let unknownError { 
     print("Error: \(unknownError)") 
     print("Error type: \(unknownError.dynamicType)") 
     if let dispStyle = Mirror(reflecting: unknownError).displayStyle { 
      print("Error type displaystyle: \(dispStyle)") 
     } 
    } 
} 

fuzz() 
/* Output examples: 

    Error: SomeError 
    Error type: HiddenError 
    Error type displaystyle: Enum 

    // 

    Error: Error Domain=foo Code=0 "(null)" 
    Error type: AnotherError 
    Error type displaystyle: Class 

    // 

    Error: Error Domain=foo Code=0 "(null)" 
    Error type: NSError 
    Error type displaystyle: Class    */ 
+1

Итак, нет способа узнать, какой тип ошибки будет выброшен раньше времени? – Boon

+1

Если метод бросания, который вы вызываете, является черным ящиком (и никакими документами), вы останетесь с интроспекцией времени выполнения, чтобы выяснить, какие ошибки может вызвать метод. Однако, как правило, это не должно быть так, и вы можете вязать свои фразы 'catch' с конкретными ошибками, которые вы используете expext. Также обратите внимание, что все ошибки выше _conform_ на 'ErrorType' (и что ошибка, возникающая в Swift, должна соответствовать типу, соответствующему этому). – dfri

Смежные вопросы