2014-02-18 5 views
2

데이터베이스를 쿼리하기 위해 일부 클래스를 정의했습니다. 나는이 같은 전화errormessage를 서버에서 클라이언트로 전달

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); 
     }); 
     }); 
    } 
    } 

: 데이터베이스가 I을 실행하지 않는 경우

var sql = new SqlGetData(pool); 
    sql.run('select firstName, lastName from person where id =' + s1).then((rows) { 
    some code here to process the data 
    }); 

내가 잡아 일부 클라이언트에 전달하려는 readData에서 return pool.query에 오류를 얻을 에러 메시지. 서버가 죽는 것을 막기 위해 어떻게 try ... catch ...을 코딩 할 수 있습니까? 내 문제는 내가 미래를 되돌려 줘야한다는 것이다. 그것은 아직도 이해하기 어렵다.

답변

1

이 문서 Futures and Error Handling (아직 작성하지 않은 경우)을 살펴보십시오.

.then((_) => doSomething(), 
     onError: (e) => doErrorHandling()).catchError((e) => doErrorHandling()); 
0

귄터의 대답은 좋다 :

두 곳이 있습니다. 다음은 몇 가지 추가 팁입니다.

.catchError()를 명명 된 매개 변수보다 사용하는 것이 더 일반적입니다. 의심 스럽다면 .catchError() 만 사용하십시오.

비동기 코드의 한 가지 문제는 catchbaseError 핸들러를 코드베이스의 어느 위치 에든 추가하는 것을 잊어 버리고 오류가 발생하면 전체 서버를 중단시킵니다. 안좋다. 그러나 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() 핸들러에도 불구하고, 서버를 중지하지 않고 실행됩니다. 참고로, 쿼리가 실행될 때와 동일한 영역 내에서 풀/연결을 시작해야합니다.

관련 문제