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
答案 0 :(得分:2)
选择catch
- 表达式limited to types /不提供switch
之类的模式匹配功能:
从上到下检查Catch块,第一个类型兼容,并选择抛出的值。
ErrorType
枚举的所有值与ErrorType
类型兼容。这意味着不幸的是,我认为你能做的最好的事情就是捕获ErrorType
,然后使用switch
在catch-block中进行选择,并可能重新抛出它。但请注意,简单的throw e
目前会导致堆栈跟踪丢失,如#4159中所述。