2015-12-08 130 views
3
/catch語句

我一直想做到這一點:如何避免嵌套做Swift2

do { 
    let result = try getAThing() 
} catch { 
    //error 
} 

do { 
    let anotherResult = try getAnotherThing(result) //Error - result out of scope 
} catch { 
    //error 
} 

,但似乎只能夠做到這一點:

do { 
    let result = try getAThing() 
    do { 
      let anotherResult = try getAnotherThing(result) 
    } catch { 
      //error 
    } 
} catch { 
    //error 
} 

有沒有辦法讓一個不變的result範圍內無需嵌套do/catch塊?有沒有辦法來防止類似於我們如何使用guard語句作爲if/else塊的反轉的錯誤?

回答

7

在Swift 1.2中,可以將常量的聲明與常量的賦值分開。 (請參閱「現在常量是更強大和一致」的Swift 1.2 Blog Entry)。所以,結合與雨燕2的錯誤處理,你可以這樣做:

let result: ThingType 

do { 
    result = try getAThing() 
} catch { 
    // error handling, e.g. return or throw 
} 

do { 
    let anotherResult = try getAnotherThing(result) 
} catch { 
    // different error handling 
} 

另外,有時候我們並不真正需要兩個不同的do - catch語句和一個catch將在一個塊處理這兩個潛在引發的錯誤:

do { 
    let result = try getAThing() 
    let anotherResult = try getAnotherThing(result) 
} catch { 
    // common error handling here 
} 

這只是取決於你需要什麼類型的處理。

+0

我認爲這也能工作,但我得到一個xCode錯誤 - 在初始化之前使用的常量'結果' – nwales

+0

然後,您有一個'catch'路徑,它允許代碼繼續執行並且到達另一行儘管'結果'沒有被分配。但是,如果你「返回」或「拋出」一個錯誤,你將不會得到那個錯誤。 – Rob

+1

是的,這是完全正確的,我沒有返回或拋出我的catch塊,所以無論我需要或需要使結果可選。 – nwales