0

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

我得到的错误如下:“未捕获的错误:异常:fConnectToDb:数据库未连接堆栈跟踪:…………。”</p>

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

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 方法,而不这样做似乎是问题所在。问题可能与未完成的未来有关,但我不知道该怎么做,也抛出异常。

有问题的整体代码如下。我在第 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  }
4

1 回答 1

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;
}
于 2013-08-10T09:43:28.063 回答