如何从异步块(在 F# 中)捕获错误?

问题描述 投票:0回答:1

由于未知的原因,我无法找出任何会返回错误而不会使代码崩溃的东西!

在 F# 中,

// 该函数可能会抛出错误(例如,文件路径可能不存在)。将其包含在外部异步块中以捕获错误。

let writeJsonAsync (r:Report[]) (file:string) = 
      async {
             
                let json = Json.serialize r

                let directory = Path.GetDirectoryName(file) // file is the absolute path.

                if  Directory.Exists directory
                then 
                    System.IO.File.WriteAllText(file, json)  // creates a new file if the file is not created. It will overwrite the existing file.
                else 
                    raise <| DirectoryNotFoundException()  <***--NO MATTER WHAT, THIS CRASHES!
           }


// Save to local file with Json.
let saveReportConfigurationAsync (r:Report[], file:string)  = 
    async {
       let! foo = 
          async  {
                   try 
                        return! writeJsonAsync r file
                   with ex -> failwith "unreachable"                     
                 }
        
       foo  
    }

非常感谢任何帮助。 TIA

exception f# try-catch
1个回答
0
投票

Async.Catch
应该做你想做的事。如果计算成功完成,它将返回
Choice1Of2
以及返回值。如果计算在完成之前引发异常,那么它将返回
Choice2Of2
并引发异常:

let saveReportConfigurationAsync (r:Report[], file:string)  = 
    Async.Catch(writeJsonAsync r file)
© www.soinside.com 2019 - 2024. All rights reserved.