gpt4 book ai didi

f# - 是否可以附加到 AppDomain.UnhandledException 事件?

转载 作者:行者123 更新时间:2023-12-01 02:53:10 24 4
gpt4 key购买 nike

我正在尝试创建一个 AppDomain 并从 F# 附加到它的 UnhandledException 事件,但我运气不佳。在我的事件处理程序中,我需要对触发事件的域以及事件参数的引用。

要重现此问题,必须在已编译的应用程序中运行以下代码。在 F# Interactive 中运行它会产生一个不同的、可能不相关的错误。

open System
open System.Reflection

let domainError (domain:AppDomain) (args:UnhandledExceptionEventArgs) =
()

let domain = AppDomain.CreateDomain("test")
domain.UnhandledException
|> Event.add (domainError domain)

这编译得很好,但在运行时我收到以下错误:

SerializationException: Type 'Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers+h@720' in assembly 'FSharp.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.



伴随此错误的堆栈跟踪如下:
at System.AppDomain.add_UnhandledException(UnhandledExceptionEventHandler value)
at Program.clo@9.Invoke(UnhandledExceptionEventHandler eventDelegate) in c:\users\joel\documents\visual studio 2010\Projects\EventTest\Program.fs:line 9
at Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers.CreateEvent@716.Subscribe(IObserver`1 observer)
at Microsoft.FSharp.Control.CommonExtensions.SubscribeToObservable[T](IObservable`1 x, FSharpFunc`2 callback)
at Microsoft.FSharp.Control.EventModule.Add[T,TDel](FSharpFunc`2 callback, IEvent`2 sourceEvent)
at <StartupCode$EventTest>.$Program.main@() in c:\users\joel\documents\visual studio 2010\Projects\EventTest\Program.fs:line 9

现在我显然做不到 Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers+h@720可序列化,那么任何人都可以提出一种可行的附加到这个特定事件的方法吗?感谢您的任何建议。

更新

感谢 ChaosPandion 的建议,此版本有效:
open System
open System.Reflection

let domainError (sender:obj) (args:UnhandledExceptionEventArgs) =
let problemDomain = sender :?> AppDomain
printfn "Unhandled exception in app domain: %s" problemDomain.FriendlyName
()

let domain = AppDomain.CreateDomain("test")
domain.UnhandledException.AddHandler(UnhandledExceptionEventHandler(domainError))

最佳答案

经过更多调整后,我发现此示例将失败:

let domainError (domain:AppDomain) =
let handler (sender:obj) (e:UnhandledExceptionEventArgs) =
let msg = (e.ExceptionObject :?> Exception).Message
printfn "An exception was unhandled in %s\nMessage:%s" domain.FriendlyName msg
new UnhandledExceptionEventHandler(handler)

let main() =
let domain = AppDomain.CreateDomain("test")
let handler = domainError domain
domain.UnhandledException.AddHandler handler

我打开了 Reflector 并找到了根本原因。 (现在回想起来,这实际上很明显。)
internal class handler@28 : OptimizedClosures.FSharpFunc<object, UnhandledExceptionEventArgs, Unit>
{
// Fields
public AppDomain domain;

// Methods
internal handler@28(AppDomain domain);
public override Unit Invoke(object sender, UnhandledExceptionEventArgs e);
}

这几乎意味着你可以让它工作的唯一方法是不围绕域对象创建闭包。我不确定这是否适合您,但您可能想尝试在处理程序中使用以下内容。
AppDomain.CurrentDomain

关于f# - 是否可以附加到 AppDomain.UnhandledException 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com