2017-08-28 11 views
3

Haxeはほとんど何も投げることを許可しますが、キャッチする能力には少し制限があるようです。私はほとんど何をキャッチすることができますがスローされたEnum値のキャッチ

class Error 
{ 
    public static var CATCH_ALL:Bool = false; 
    public static function Throw(aError:ErrorType, ?ignore:Bool=false, ?inf:PosInfos):Void 
    { 
     trace('Error: $aError at ' + inf.className + ':' + inf.methodName + ':' + inf.lineNumber); 
     if (!CATCH_ALL && !ignore) 
     { 
      throw aError; 
     } 
    } 
} 

enum ErrorType 
{ 
    NULL_PARAM(msg:String); 
    NOT_FOUND(msg:String); 
} 

、私は基本的な型、クラス型と列挙型に限られています:例えば、私はERRORTYPE列挙型の値をスローする静的誤差関数を持っています。つまり、すべての文字列を取得できますが、具体的には「potato」を含む文字列は取得できません。複数のエラークラスを作成すると、他のクラスを無視して特定のクラスタイプをキャッチできますが、同じことはenumでは可能ではないようです。コンパイルする次のコードに代わるものがありますか?

try 
{ 
    Error.Throw(ErrorType.NULL_PARAM('Potato')); 
} 
catch (e:ErrorType.NULL_PARAM) trace(e); //does not work nor compile 
catch (e:ErrorType) trace(e); //works, but catches every error 

答えて

2

選択catchの-expressionsはswitchが行うようなパターンマッチング機能を提供していない/ limited to typesである:

catchブロックは、その型互換性のある最初のもので上から下にチェックされスローされた値が選択されます。

ErrorType列挙のすべてErrorTypeタイプと互換性があります。つまり、残念ながらErrorTypeをキャッチし、キャッチブロック内の選択をswitchを使って行い、潜在的に再スローすることです。ただし、単純なthrow eは、現在、#4159で説明されているように、スタックトレースが失われることに注意してください。

+0

答えをありがとう。だから、もし私がエラーを起こしたらスタックトレースを失う。代わりにPosInfoをエラーオブジェクトに含めて、少なくともスタックなしでも位置データを保持することができます。または単にエラーオブジェクトを持つ私の古い方法に戻って、あらゆる種類のエラーに対して拡張されたクラスに戻ってください。私はどこかで、パラメータを持つenum値がコード生成のクラスと似ていることを読んでいたので、一意の型として機能することを期待しました。 –

+1

一部のプラットフォームでコールスタックを保持できることに注意してください。 Nekoにはその問題で言及されている['neko.Lib.rethrow'](http://api.haxe.org/neko/Lib.html#rethrow)があります。 – Gama11

関連する問題