捕获抛出的枚举值

时间:2017-08-28 19:26:13

标签: haxe

Haxe允许抛出几乎任何东西,但它的捕获能力似乎有点受限。例如,我有一个静态错误函数,它抛出ErrorType枚举的值:

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);
}

虽然我几乎可以捕获任何东西,但我仅限于基本类型,类类型和枚举类型。这意味着我可以捕获每个字符串,但不是特别是包含“马铃薯”的字符串。如果我创建了多个错误类,我可以捕获一个特定的类类型而忽略其他类,但同样的事情似乎不可能与枚举。是否有替代以下代码可以编译?

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

1 个答案:

答案 0 :(得分:2)

选择catch - 表达式limited to types /不提供switch之类的模式匹配功能:

  

从上到下检查Catch块,第一个类型兼容,并选择抛出的值。

ErrorType枚举的所有ErrorType 类型兼容。这意味着不幸的是,我认为你能做的最好的事情就是捕获ErrorType,然后使用switch在catch-block中进行选择,并可能重新抛出它。但请注意,简单的throw e目前会导致堆栈跟踪丢失,如#4159中所述。