将错误消息从服务器传递到客户端

时间:2014-02-18 16:55:07

标签: dart dart-async

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

  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 ...以防止服务器死亡?我的问题是我必须退还期货,这对我来说仍然很难掌握。

2 个答案:

答案 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()处理程序,但此代码将在不关闭服务器的情况下运行。注意,您需要在与其中执行查询相同的区域内启动池/连接。

相关问题