【发布时间】:2012-01-04 04:37:54
【问题描述】:
我无法找出以下代码未捕获异常的原因。这是我第一次在 F# 中使用 Async,所以我确信这很简单
open System
open Microsoft.WindowsAzure
open Microsoft.WindowsAzure.StorageClient
open System.Windows.Forms
let mutable connection = "UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://ipv4.fiddler"
CloudStorageAccount.SetConfigurationSettingPublisher(fun cName cPublisher ->
cPublisher.Invoke connection |> ignore)
let storageAccount = CloudStorageAccount.Parse connection
let createTable tableName =
let client = storageAccount.CreateCloudTableClient()
async{
try
do! Async.FromBeginEnd(tableName, client.BeginCreateTable , client.EndCreateTable)
MessageBox.Show "Created" |>ignore
with
| :? StorageClientException -> printfn "failed"; MessageBox.Show("failed to create table") |> ignore
| _ -> printfn "Failed with unknown exception"
} |> Async.Start
[<EntryPoint; STAThread>]
let main(args) =
let form = new Form()
let btn = new Button(Text = "Click")
btn.Click.AddHandler(fun _ _ -> createTable "SomeNewTable")
form.Controls.Add btn
let result = form.ShowDialog()
0
如果我运行它并且表已经被创建,它表示代码中没有处理 StorageClientException 类型的异常,特别是指向 FromBeginEnd 调用的 client.EndCreateTable 部分
【问题讨论】:
-
有点小问题,但如果你的异常处理程序被调用,它可能不会从 UI 线程调用,所以
MessageBox.Show不是一个好主意。 -
如果将
Async.Start替换为Async.RunSynchronously会有所不同吗? -
是的,messageBox 目前只是用于测试。稍后它将被替换为回调函数。换成 RunSynchronously 不会改变任何东西:(
-
您的目标是什么版本的 .NET?你有没有安装VS2010 SP1?
标签: asynchronous f# azure-table-storage