我在使用 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 }