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