退出Dart async Future时为什么以下错误未被捕获(正确)?

时间:2013-08-07 10:05:03

标签: dart

我在使用Dart postgresql数据库驱动程序(Github上的xxgreg)时遇到问题,因为当postgresql服务器没有运行且需要时,我无法正确处理错误。我试图解决这个问题一段时间了,所以任何帮助都会受到赞赏。我可以通过静默处理它并简单地测试数据库连接对象是否为空来轻松解决它,但我认为应该可以处理引发错误。应该注意的是,当Postgresql服务器运行时,没有问题。

我得到的错误如下: “未捕获错误:异常:fConnectToDb:数据库未连接 堆栈跟踪:............“

问题区域涉及这些代码行:(第663行从下面的第169行调用)

663  async.Future<bool> fConnectToDb(String sUri) {
664    async.Completer<bool> oCompleter = new async.Completer<bool>();
665    
666    pg.connect(sUri)
667    .catchError((oError) {
668      String sErrorMsg = (oError is SocketException) ?
669      "Database is not connected"
670      : "Fatal error encountered ${oError}";
671      throw("fConnectToDb: ${sErrorMsg}");  
//(expanded below)

我以前在这个区域遇到过问题,在第671行,我没有抛出异常,而是调用了显示错误的内部方法,并终止了程序。然而,我发现这样做似乎是一个问题,我发现在这种情况下,抛出错误使程序退出Future方法,而不是这样做似乎是问题。问题可能与Future未完成有关,但我不知道如何做到这一点并且也会抛出异常。

有问题的整体代码如下。我尝试了第167行...... 406,但是这也没有发现错误。

164  /*
165   * Connect to database
166   */
167    try {
168    sCheckpoint   = "Connect to Database";  
169    fConnectToDb(sUri)
170    .catchError((oError) =>
171      fFatal(sCheckpoint, "Error = \n${oError}"))
172    .then((_) {
173      if (ogDb == null)   // ogDb is global object for db connection
174       fFatal(sCheckpoint, "Database did not connect");
175      
176    /*
177     * Perform an SQL Select to test connection
178     */
179      ogPrintLine.fPrintForce("Testing Db connection .....");
180      sCheckpoint = "test connection";
181      return fProcessSqlSelect ("SELECT count(*) FROM ${S_TABLE_NAME}",
182                                 false);
183    }).then((llResult) {
184  
    …………
    …………
    // (catch related to line 167)
406  } catch(oError) {fFatal("Program Main()",
407                 "Checkpoint ${sCheckpoint}, Error = \n${oError}");}
408  }

………..
………..
660  /*
661   * Connect To Database
662   */
663  async.Future<bool> fConnectToDb(String sUri) {
664    async.Completer<bool> oCompleter = new async.Completer<bool>();
665  
666    pg.connect(sUri)
667    .catchError((oError) {
668      String sErrorMsg = (oError is SocketException) ?
669      "Database is not connected"
670      : "Fatal error encountered ${oError}";
671      throw("fConnectToDb: ${sErrorMsg}");  
672      
673    }).then((pg.Connection oDb) {
674      ogDb = oDb;
675      oCompleter.complete(true);
676      return;
677  
678    });
679   
680    return oCompleter.future;
681  }

1 个答案:

答案 0 :(得分:0)

据我所知,在我看来,在Future中抛出一个错误是好的,前提是它后面跟一个不会引发错误的catchError()。

以下代码似乎可以解决我遇到的问题:

/*
 * Connect To Database
 */
async.Future<bool> fConnectToDb(String sUri) {
  async.Completer<bool> oCompleter = new async.Completer<bool>();

  pg.connect(sUri).then((pg.Connection oDb) {
    ogDb = oDb;      // assign to global database object
    oCompleter.complete(true);
    return;
  }).catchError((oError) =>
     fFatal("fConnectToDb", "Error=\n${oError}"));
  return oCompleter.future;
}