2016-12-17 2 views
1

スウィフト3では、キャッチャーが問題の解決/処理に使用できるエラー/例外に(多くの場合があります)追加情報を入れるための推奨方法は何ですか?私が見たすべての例では、値がenumのものを使用しています。これは、多くの情報があまりにも冗長であると思われます。スウィフト3エラー(追加データあり)

具体的には、単純なパーサーを作成していますが、影響を受ける行と列の番号(将来的にはその他の情報)を格納する場所が必要ですが、すべてのハンドラがそれらを明示的に関連値として宣言する必要はありません。発信者に負担がかかる。

この時点で、私は基本的に、特にエレガントなようですどちらもこれを行うための2つの方法が、見ることができる2つの異なるものを定義する必要がどちらも:

  1. エラーの種類を表し、外側enumエラーを定義
  2. オブジェクトを実際のErrorとして使用し、enumのケースを実際のエラー状態を表すコンストラクタに渡します。

どちらも単純なアイデアやエラーを表現するために2つの別々の概念を取り入れているため、これらの両方はやや汚れています。これを行うにはより良い方法があるかと思います。

潜在的にたくさんの追加情報を含める必要があるエラーを処理するための規則や推奨方法はありますか?

+1

私はあなたの質問を正しく理解しているかどうかはわかりませんが、具体的な例が参考になるかもしれません。 - しかし、1) 'enum'は値を関連づけることができる、2)エラーは' struct'または 'class'(プロパティ付き)である可能性があるので、' enum'である必要はありません。 –

+0

私は構造体を使用することができ、オプション2を使うことができますか?それは基本的にはより伝統的な例外オブジェクトと同じですが、その構造体内で列挙型を定義するとあまりにも醜いことはありません。 – devios1

+0

具体的には、単純なパーサーを作成しています。影響を受ける行と列の番号(将来的には他の情報も含む)を保存する場所が必要ですが、すべてのハンドラがそれらを明示的に関連値として追加する必要はありません。 – devios1

答えて

2

"推奨されている"方法があるかどうかわかりませんが、おそらく他の人が に答えるか、より良い解決策を提供することができます。

しかし、一つ可能アプローチは、エラーの種類としてstruct(特性を有する)を使用し、 設ける必要がない値のオプションのプロパティを使用することであろう。例:

struct ParserError: Error { 
    enum Reason { 
     case invalidCharacter 
     case unexpectedEOF 
    } 
    let reason: Reason 
    let line: Int? 
    let column: Int? 

    init(reason: Reason, line: Int? = nil, column: Int? = nil) { 
     self.reason = reason 
     self.line = line 
     self.column = column 
    } 
} 

一つも 具体的なエラーの種類がキャッチャーで知られていない場合でも は賢明なエラーの説明を提供するために、LocalizedErrorプロトコルを採用する場合があります(How to provide a localized description with an Error type in Swift?を比較):

extension ParserError: LocalizedError { 
    public var errorDescription: String? { 
     var description: String 
     switch reason { 
     case .invalidCharacter: 
      description = "Invalid Character in input file" 
     case .unexpectedEOF: 
      description = "Unexpected end of file" 
     } 
     if let line = line { 
      description += ", line \(line)" 
     } 
     if let column = column { 
      description += ", column \(column)" 
     } 
     return description 
    } 
} 

使い方例:

func parse() throws { 
    // Throw error with line number, but without column: 
    throw ParserError(reason: .invalidCharacter, line: 13) 
} 

do { 
    try parse() 
} catch let error { 
    print(error.localizedDescription) 
} 

出力:

 
Invalid Character in input file, line 13 
+0

これは私が探していたものです、ありがとう!また、LocalizedErrorチップのおかげで、 – devios1

関連する問題