2

我定义了一些类来查询数据库。

  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.queryin上收到一个错误readData,我想在一些错误消息中捕获并传递给客户端。我如何以及在哪里编写代码try ... catch ...以防止服务器死机?我的问题是我必须返回期货,这对我来说仍然难以掌握。

4

2 回答 2

1

看看这篇文章期货和错误处理(如果你还没有的话)。

有两个地方:

.then((_) => doSomething(), 
      onError: (e) => doErrorHandling()).catchError((e) => doErrorHandling());
于 2014-02-18T17:01:39.670 回答
0

Guenter 的回答很好。这里有一些额外的提示。

使用 .catchError() 比使用命名参数更常见,如果有疑问,只需使用 .catchError()。

异步代码的一个问题是,如果您忘记在代码库的任何位置添加 catchError 处理程序,并且触发了错误,它将使您的整个服务器停机。不好。但是,您可以使用区域来处理代码中未捕获的错误,并防止这种情况发生。

在撰写本文时,关于 Zones 的文档并不多,因为它是一项新功能。Florian Loitsch 正在撰写一篇文章,该文章很快就会出现在这里。这是使用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() 处理程序,但此代码将在不关闭服务器的情况下运行。请注意,您需要在执行查询的同一区域内启动池/连接。

于 2014-02-18T22:37:17.580 回答