Mysql 有没有办法查询类是否包含具有某个已知名称的实例变量?
从MySql截取错误时,事先不知道传递给我的错误类的内容是什么。因此,我将代码:Mysql 有没有办法查询类是否包含具有某个已知名称的实例变量?,mysql,dart,dart-mirrors,Mysql,Dart,Dart Mirrors,从MySql截取错误时,事先不知道传递给我的错误类的内容是什么。因此,我将代码: .catchError((firstError){ sqlMessage=firstError.message; 试试{ sqlError=firstError.osError; }捕获(NOINSTANCERROR){ sqlError=firstError.sqlState; } }); 在这个特定的例子中,我想知道e是否包含实例变量osError或sqlState,因为它们中的任何一个都包含特定的error
.catchError((firstError){
sqlMessage=firstError.message;
试试{
sqlError=firstError.osError;
}捕获(NOINSTANCERROR){
sqlError=firstError.sqlState;
}
});
在这个特定的例子中,我想知道e是否包含实例变量
osError
或sqlState
,因为它们中的任何一个都包含特定的errorcode。更一般地说(为了提高我的知识水平),如果(firstError.instanceExists(osError))…以及如何编写这样的代码是可能的吗?这应该是您想要的:
导入“dart:mirrors”;
...
//关于类声明的信息
reflect(firstError).type.declarations.containsKey(#osError);
//有关当前实例的信息
var m=reflect(firstError).type.instanceMembers[#osError];
var hasOsError=m!=null&&m.isGetter;
Günter的回答正确地说明了如何使用镜像,但是对于您的特定用例,我建议使用“是”检查而不是镜像。我不知道mysql API的具体情况,但它可能看起来像这样:
.catchError((error) {
sqlMessage = error.message;
if (error is MySqlException) {
sqlError = error.sqlState;
} else if (error is OSError) {
sqlError = error.errorCode;
}
})
也许你可以向本书的作者请教。你能用一个“is”表达式来测试这是哪个异常类吗?镜像是一个重量级的锤子,很难编译成js,如果可以的话最好只使用“是”。你能举个例子吗。如果类中未定义变量,则“if(class.variable is String)”会引发异常。在没有镜像的情况下,无法测试Dart中对象上是否存在变量。但是,您可以测试对象是否是类,因为您知道类始终具有变量,所以这就是您所需要的。如果(ex是MySqlException){print(ex.sqlState);}