Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么退出Dart异步未来时未捕捉到以下错误(正确)?_Dart - Fatal编程技术网

为什么退出Dart异步未来时未捕捉到以下错误(正确)?

为什么退出Dart异步未来时未捕捉到以下错误(正确)?,dart,Dart,我在Github上使用Dart postgresql数据库驱动程序xxgreg时遇到问题,因为当postgresql服务器未运行且需要运行时,我无法正确处理错误。我试图解决这个问题已经有一段时间了,所以任何帮助都将不胜感激。我可以通过静默地处理它并简单地测试数据库连接对象是否为null来轻松解决它,但是我认为应该可以处理引发错误的情况。应该注意的是,当Postgresql server运行时,没有问题 我得到的错误如下: “未捕获错误:异常:fConnectToDb:数据库未连接 堆栈跟踪:……

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

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

问题区域与这些代码行相关:从下面的第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行,我没有抛出异常,而是调用了一个显示错误的内部方法,并终止了程序。然而,我发现这样做似乎是个问题,我发现在这种情况下,抛出一个错误使程序能够退出未来的方法,而不这样做似乎是个问题。这个问题可能与未完成的未来有关,但我不知道如何做到这一点,并且抛出一个异常

有关的总体代码如下。我在第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  }

就我所能确定的,在我看来,在未来抛出一个错误是可以的,前提是后面跟着一个不会抛出错误的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;
}