2017-05-03 19 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"); 
    } 
} 

私は即座にアプリを書いており、同じことをしたいと思います。これは可能ですか?他の可能な解決策は何が可能なのでしょうか?呼び出しを行う私の元の関数は、この構造を持っています。

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)の「The Swift Programming Language」の章を参照してください。 – rmaddy

+0

はい、私はそこに私の質問への答えを見つけることができませんでした。 – Jacob

答えて

4

に相当し、あなたがする必要があります

の1-Error Protocolに準拠列挙を宣言することで、カスタムエラータイプを作成します。 :

は、スロー可能な関数としてfoo()を宣言:

スロー可能関数として bar()宣言
func foo() throws { 
    throw CustomError.error01 
} 

3-bar()は(throws)スロー可能であるが、それはなぜ、throwが含まれていないことを

func bar() throws { 
    try foo() 
} 

が注? foo()(これはエラーをスローする関数でもあります)をtryと呼び出すことで、スローが暗黙のうちにfoo()に行われることを意味します。

、4-test()機能(DO-キャッチ)を実装します:として

test() // error01 has been caught! 

test()関数を呼び出す

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

、5-をそれをより明確にする

あなたが見ることができる、bar()自動的にエラーを投げる、wh ichはfoo()機能エラーの投げを指しています。

0

スウィフトは、エラーの伝播を処理し、ないは、例外メカニズムを持っています。 Swiftでは、呼び出された関数は、遭遇したエラーを呼び出し元のコンテキストに渡すことができます。しかし、キーワードthrowを使用しているにもかかわらず、実際に例外をスローしているわけではありません。関数の戻り値とは別のチャネルを介してエラーを渡すだけです。

私は、呼び出し元のルーチンが、エラー自体として呼び出された関数のエラーを解釈し、それに関連するエラーを呼び出し元に渡すことができると考えていますが、一般的にSwiftには誤った条件に遭遇したときにスタックフレームを飛び越す。

2

スウィフト関数は、関数自体はthrowsでマークされなければならない、と

  • 投げ関数が呼び出されなければなら
    • throw INGの関数を呼び出すと、呼び出し元までエラー を渡すが、

      することができます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) 
    } 
    

    出力:呼び出し元にfoo()によってスローされたエラーを伝播

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

    try foo()bar()戻ってすぐに失敗した場合、 。投げ関数内言い換えれば 、try foo()Swift - Error Handling Documentationを参照

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

    Swiftでは、エラーはエラープロトコルに準拠した型の値で表されます。この空のプロトコルは、エラーハンドリングにタイプを使用できることを示します。

    スウィフトスロー機能のみがエラーを伝播する可能性があります。非スローイング関数の内部でスローされたエラーは、その関数内で処理されなければなりません。

    エラーをスローすると、予期せぬことが起こり、実行の通常の流れを続行できないことを示すことができます。 throw文を使用してエラーをスローします。

    Swiftでエラーを処理するには4つの方法があります。

    • あなたは、その関数を呼び出すコードに関数からエラーを伝播することができ、
    • がdo-catchステートメントを使用してエラーを処理し、
    • は、オプションの値としてエラーを処理、または
    • は、エラーは発生しないと主張します。多くの言語-含むスウィフトの取り扱いのObjective-C-エラーがスウィフトのエラーはJavaのチェック例外と同じように使用されていますが、コールスタック

    をほどく必要としないで例外処理とは異なり

    、彼らは全く同じことではありません。

    Swiftでのエラー処理は、try、catch、throwキーワードを使用して、他の言語での例外処理に似ています。 SwiftのObjective-Cエラーハンドリングを含む、多くの言語での例外処理とは異なり、計算コストがかかるプロセスであるコールスタックの巻き戻しは必要ありません。したがって、throw文のパフォーマンス特性はreturn文の性能特性に匹敵します。

    Swift Error Handling

    関連する問題