2017-05-03 33 views
0

在java中,如果一個方法拋出錯誤,調用它的方法可以將它傳遞給下一個方法。如何在Swift中傳遞錯誤堆棧跟蹤

public void foo() throws Exception { 
    throw new Exception(); 
} 
public void bar() throws Exception { 
    foo(); 
} 
public static void main(String args[]) { 
    try { 
     bar(); 
    } 
    catch(Exception e) { 
     System.out.println("Error"); 
    } 
} 

我正在寫swift的應用程序,並希望做同樣的事情。這可能嗎?如果不可能,還有其他可能的解決方案是什麼?我的原來的功能,使呼叫有這樣的結構。

func convert(name: String) throws -> String { 

} 
+1

你讀過[錯誤處理](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/ UID/TP40014097-CH42-ID508)「Swift編程語言」一書的章節? – rmaddy

+0

是的,我無法在那裏找到我的問題的答案。 – Jacob

回答

4

參考Swift - Error Handling Documentation,你應該:

創建自定義的錯誤類型,通過聲明枚舉這符合Error Protocol

enum CustomError: Error { 
    case error01 
} 

2-聲明foo()爲拋出功能:

func foo() throws { 
    throw CustomError.error01 
} 

3-聲明bar()爲拋出功能:

func bar() throws { 
    try foo() 
} 

注意,雖然bar()是拋出(throws),它包含throw,爲什麼?因爲它調用foo()(這也是一個引發錯誤的函數),因此try意味着投擲將顯式地轉到foo()

爲了更清楚:

4-實現test()功能(DO-捕捉):

func test() { 
    do { 
     try bar() 
    } catch { 
     print("\(error) has been caught!") 
    } 
} 

調用test()功能:

test() // error01 has been caught! 

由於你可以看到,bar()自動拋出錯誤,wh ich指的是foo()函數錯誤拋出。

0

斯威夫特處理錯誤的傳播,而不會有一個例外的機制。在Swift中,被調用的函數可以將遇到的錯誤傳遞給調用的上下文。但儘管使用關鍵字throw它實際上並沒有引發異常。它只是通過一個不同於函數返回值的通道傳遞錯誤。

我想,調用程序然後可以在它調用的函數中解釋錯誤本身,並將相關錯誤傳遞給調用者,但通常Swift中沒有允許您當遇到錯誤的情況時,跳過堆棧幀。

2

迅速函數可以調用throw相應的功能,並傳遞一個錯誤 到主叫方,但

  • 本身必須標有throws功能,並
  • 投擲函數被調用與try

實施例:

func foo() throws { 
    print("in foo") 
    throw NSError(domain: "mydomain", code: 123, userInfo: nil) 
} 

func bar() throws -> String { 
    print("in bar") 
    try foo() 
    return "bar" 
} 

do { 
    let result = try bar() 
    print("result:", result) 
} catch { 
    print(error.localizedDescription) 
} 

輸出:

 
in bar 
in foo 
The operation couldn’t be completed. (mydomain error 123.) 

如果try foo()立即bar()返回後失敗, 傳播由foo()拋出到其調用者的錯誤。 換句話說,try foo()一個投擲函數內部就相當於

do { 
    try foo() 
} catch let error { 
    throw error 
} 
0

在Swift中,錯誤由符合錯誤協議的類型值表示。這個空協議表明一個類型可以用於錯誤處理。

In Swift 只有投擲函數會傳播錯誤。任何在非拋出函數內拋出的錯誤都必須在函數內部處理。

拋出一個錯誤讓您指出發生了意外事件,並且正常的執行流程無法繼續。您使用throw語句來引發錯誤。

有四種方法可以處理Swift中的錯誤。

  • 您可以從一個函數來調用該函數的代碼傳播錯誤,
  • 使用DO-catch語句處理錯誤,
  • 處理錯誤,作爲一個可選的值,或
  • 斷言錯誤不會發生。

    不像異常處理在許多語言,包括Objective-C的錯誤在迅速處理不涉及解開調用棧

雖然以類似的方式被用於Java的受檢異常斯威夫特錯誤,他們不是完全一樣的東西。

Swift中的錯誤處理類似於其他語言中的異常處理,使用try,catch和throw關鍵字。與許多語言中的異常處理不同 - 包括Swift中的Objective-C錯誤處理不涉及展開調用堆棧,這是一個計算成本很高的過程。因此,throw語句的性能特徵與返回語句的性能特徵相當。

看到Swift Error Handling