1

当从 MySql 拦截错误时,事先不知道传递给我的错误类的内容是什么。所以我编码:

.catchError((firstError) {
  sqlMessage = firstError.message; 
  try {        
    sqlError = firstError.osError;
  } catch (noInstanceError){
    sqlError = firstError.sqlState;
  }
});

在这种特定情况下,我想知道 e 是否包含实例变量osErrorsqlState,因为它们中的任何一个都包含特定的错误代码。更一般地说(以提高我的知识)是否有可能写出类似的东西if (firstError.instanceExists(osError)) ...,以及如何写?

4

2 回答 2

1

这应该做你想要的:

import 'dart:mirrors';

...

// info about the class declaration
reflect(firstError).type.declarations.containsKey(#osError);

// info about the current instance
var m = reflect(firstError).type.instanceMembers[#osError];
var hasOsError = m != null && m.isGetter;
于 2014-02-23T20:43:30.823 回答
1

Günter 的回答正确显示了如何使用镜像,但是对于您的特定用例,我建议使用“is”检查而不是镜像。我不知道具体的 mysql API,但它可能看起来像这样:

.catchError((error) {
   sqlMessage = error.message;
   if (error is MySqlException) {
     sqlError = error.sqlState;
   } else if (error is OSError) {
     sqlError = error.errorCode;
   }
})

或许可以向sqljocky的作者James Ots寻求建议。

于 2014-02-24T19:53:37.893 回答