2013-05-20 38 views
5

Tôi đang cố viết mã không chặn trong F #. Tôi cần phải tải xuống một trang web, nhưng đôi khi trang web đó không tồn tại và ngoại lệ được ném (404 Not Found) bởi AsyncDownloadString. Tôi đã thử mã dưới đây nhưng nó không biên dịch.Xử lý ngoại lệ không đồng bộ trong F #

Làm cách nào để xử lý ngoại lệ từ AsyncDownloadString?

Tôi giả sử xử lý ngoại lệ ở đây như thế nào? Nếu một lỗi được ném, tôi chỉ muốn trả về một chuỗi rỗng hoặc một chuỗi có một thông báo trong đó.

Trả lời

11

Chỉ cần thêm từ khóa return khi bạn quay trở lại chuỗi lỗi của bạn:

let downloadPage(url: System.Uri) = async { 
    try 
     use webClient = new System.Net.WebClient() 
     return! webClient.AsyncDownloadString(url) 
    with error -> return "Error" 
} 

IMO một cách tiếp cận tốt hơn sẽ được sử dụng Async.Catch thay vì trả lại một chuỗi lỗi:

let downloadPageImpl (url: System.Uri) = async { 
    use webClient = new System.Net.WebClient() 
    return! webClient.AsyncDownloadString(url) 
} 

let downloadPage url = 
    Async.Catch (downloadPageImpl url) 
+0

Cảm ơn bạn Jack! Nó hoạt động! :) Tại sao bạn nghĩ Async.Catch là một cách tiếp cận tốt hơn. Tôi nghĩ rằng việc xử lý ngoại lệ nên được thực hiện trong downloadPage, phải không? – Martin

+2

Tôi nghĩ rằng 'Async.Catch' là tốt hơn bởi vì: (1) nó bảo tồn thông tin về lỗi ... có những lý do khác ngoại lệ có thể được ném bên cạnh một 404, và có ngoại lệ thay vì" Lỗi "làm cho nó dễ dàng hơn để chẩn đoán vấn đề; (2) sử dụng 'Choice <_,_>' cho phép bạn sử dụng hệ thống kiểu để thực thi các đường dẫn xử lý cho cả kết quả lẫn lỗi. –