2014-01-02 5 views
3

У меня есть следующий код:бросить исключение в асинхронном

member public this.GetData(uri: string) = async { 
    let! res = Async.AwaitTask(httpClient.GetAsync uri) 
    return res 
} 

Когда свойство res.IsSuccessStatusCode является false Я хотел бы бросить исключение, как я могу добиться этого. Следующий код не будет компилироваться:

member public this.GetData(uri: string) = async { 
    let! res = Async.AwaitTask(httpClient.GetAsync uri) 
    match res.IsSuccessStatusCode with 
    | true -> return res 
    | false -> raise new Exception("") 
} 

ответ

7

Вы конечно, нужно обернуть new Exception(...) в скобках, но это не является достаточным в этом случае - обе ветви заявления матча должны возвращать значение, так что вы должны вставить также return:

async { 
    let! res = Async.AwaitTask(httpClient.GetAsync uri) 
    match res.IsSuccessStatusCode with 
    | true -> return res 
    | false -> return raise (new Exception("")) 
} 

Это на самом деле проще написать используя if вычисление, которое может содержать тело, которое возвращает блок (и генерирует исключение, если операция так и не удалось) - и поэтому вам не нужно return в этом случае:

async { 
    let! res = Async.AwaitTask(httpClient.GetAsync uri) 
    if not res.IsSuccessStatusCode then 
     raise (new Exception("")) 
    return res 
} 
+0

Спасибо, что компилируется. Что-то еще не работает, но это еще одна проблема;) – Knerd

3

Так первая часть является то, что вам нужно обернуть new Exception() с кронштейнами, чтобы убедиться, что F # интерпретирует код правильно.

raise (new Exception("")) 

или вы можете использовать любой из операторов труб

raise <| new Exception("") 
new Exception |> raise 

или вы можете изменить тип и использовать failwith

failwith "some message" 

Во-вторых, вы должны вернуться с обеих ветвей, так префикс raise с return

+0

Еще раз спасибо :) решение @tomas -petricek работает лучше :) – Knerd

Смежные вопросы