我定义了一些查询数据库的类。
class SqlGetData {
ConnectionPool pool;
List<String> rows;
SqlGetData(this.pool);
Future <List<String>> run(String sQuery) {
rows = new List<String>();
return readData(sQuery).then((_) {
return rows;
});
}
Future readData(String sQuery) {
return pool.query(sQuery).then((result) {
return result.forEach((row) {
String s = JSON.encode(row);
rows.add(s);
});
});
}
}
我称之为:
var sql = new SqlGetData(pool);
sql.run('select firstName, lastName from person where id =' + s1).then((rows) {
some code here to process the data
});
如果数据库没有运行,我在return pool.query
中的readData
收到错误,我想抓住它并在一些错误消息中传递给客户端。
我如何以及在何处编码try ... catch ...
以防止服务器死亡?我的问题是我必须退还期货,这对我来说仍然很难掌握。
答案 0 :(得分:1)
看一下这篇文章Futures and Error Handling(如果你还没有)。
有两个地方:
.then((_) => doSomething(),
onError: (e) => doErrorHandling()).catchError((e) => doErrorHandling());
答案 1 :(得分:0)
Guenter的答案很好。这里有一些额外的提示。
使用.catchError()比命名参数更常见,如果有疑问则只使用.catchError()。
异步代码的一个问题是,如果您忘记在代码库中的任何位置添加catchError处理程序,并且触发错误,则会导致整个服务器崩溃。不好。但是,您可以使用Zones处理代码中未捕获的错误,并防止这种情况发生。
在撰写本文时,没有很多关于Zones的文档,因为它是一个新功能。 Florian Loitsch正在撰写一篇文章,该文章将很快出现here。以下是使用runZoned():
的示例runZoned(() {
var pool = new Pool.connect(...); // Don't know pool API, just making this up.
pool.query(sql).then((result) {
print(result);
});
// Oops developer forgot to add a .catchError() handler for the query.
// .catchError((e) => print('Query error: $e);
}, onError: (e) => print("Uncaught error: $e"));
尽管缺少catchError()处理程序,但此代码将在不关闭服务器的情况下运行。注意,您需要在与其中执行查询相同的区域内启动池/连接。