2016-08-27 11 views
1

(主に設定ロード用)のローディングで遊んやファイルを評価し、私は例外を発生させることができ、エラーのいくつかのタイプに出くわしながら:いくつかの並べ替えがある場合、ファイルが昇給%Code.LoadError{file: ..., message: ...} すべての例外がElixirの同じモデル上に構築されないのはなぜですか?

  • 存在しない

    • 設定ファイルの構文エラーのため、一つは得ることができます:
      • %SyntaxError{description: ..., file: ..., line: ...}または
      • TokenMissingError{description: ..., file: ..., line: ...}

    残念ながら、これらの例外(xxxError S)は同じパラメータを使用して構築されていません。エラー説明messagedescription時々キー、時にはキーを持っています。コードを冗長にするすべての可能性をチェックする必要があるため、他の種類のエラーでは他のキーが使用されないことを決して確信できないため、これは非常に面倒です。

    これは何らかの理由があるのか​​、これが将来のリリースで修正されるものと思われるのかと疑問に思っていました(変更が後方非互換性を導入するため、常に難しいです)。

  • 答えて

    1

    これらのすべてdoには共通のものがあります。それらはすべてExceptionの動作を実装しています。 Exceptionのメッセージにアクセスする正しい方法は、Exception.message/1exception.messageではなく)に渡すことです。 Exceptionには、IO.inspectを使用して印刷するときに表示されるフィールド(構造体である)(チェックアウトKernel.Macros.defexception/1)が含まれている場合があります。 messageフィールドを含む場合と含まない場合がありますが、Exception.message/1に渡されると常にメッセージが返されます。ここではあなたが言及したすべての3つのエラーの例です:

    defmodule Main do 
        defmacro go(do: block) do 
        quote do 
         try do 
         unquote(block) 
         rescue 
         e -> e 
         end 
        end 
        end 
    
        def main do 
        e1 = go(do: Code.load_file("foo")) 
        e2 = go(do: Code.string_to_quoted!("do: end")) 
        e3 = go(do: Code.string_to_quoted!("do")) 
        for e <- [e1, e2, e3] do 
         IO.inspect {e.__struct__, Exception.message(e)} 
        end 
        end 
    end 
    
    Main.main 
    

    出力:

    {Code.LoadError, "could not load /private/tmp/foo"} 
    {SyntaxError, "nofile:1: unexpected token: end"} 
    {TokenMissingError, 
    "nofile:1: missing terminator: end (for \"do\" starting at line 1)"} 
    
    関連する問題