乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 85|回复: 4

Autocad UnhandledException Handling

[复制链接]

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-6-10 16:43:33 | 显示全部楼层 |阅读模式
我正在研究崩溃报告,并希望在移动设备中实现类似于crashalytics的服务。现在我正在测试Raygun,但是我在实现时遇到了一些问题。 IExtensionApplication中的推荐实现,初始化如下所示:    AppDomain。current domain . unhandled exception+= current domain _ unhandled exception;。

私有静态void current domain _ UnhandledException(对象发送方,UnhandledException eventargs e)。
{。
_Client,Send(e.ExceptionObject作为异常);。
}。
这不起作用,我的理解是,AutoCAD正在捕捉所有未处理的异常,因此调用永远不会上升到AppDomain。current domain . unhandled exception 所以我尝试通过FirstChanceException添加一个处理程序,但是它捕捉到了autocad处理的各种奇怪的东西,因此报告抛出了实际上并不影响用户的错误。该代码如下所示:    AppDomain,current domain . first chance exception+= current domain _ first chance exception;。

private void current domain _ first chance exception(对象发送方,系统。runtime . exception services . first chance exception eventargs e)。
{。
if (e .例外是Autodesk,AutoCAD . runtime . exception)。
{。
_Client,发送(e .异常);。
}。
}。
一种选择是将我的所有代码包装在try catch块中,并从那里发送错误,但是如果我决定切换到不同的报告工具,这似乎会使事情变得困难,理想情况下,我可以在iextensionapplication . initialize中的某个地方添加一个错误处理程序,有做过这方面工作的人有什么建议吗?不仅仅是如何实现这样的东西,在服务中也是如此,我希望使用一种服务,它向我发送堆栈跟踪和崩溃报告,这样我就知道哪些错误导致了最多的问题,使用类似工具进行AutoCAD项目的沼泽使用者的建议将会很有帮助。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

23

主题

239

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
327
发表于 2016-6-10 23:52:48 | 显示全部楼层
全局崩溃处理程序在RealDwg应用程序中有效,但在AutoCAD插件中似乎对我无效。我怀疑这是因为AutoCAD有自己的全局崩溃处理程序,它可以首先拦截错误,可能是在错误到达你的代码之前很久。此外,事件订阅者可以按他们想要的任何顺序运行,因此如果您的处理程序不是订阅该事件的唯一处理程序,就不能保证它会首先到达。我认为您必须以更细粒度的方式处理异常,我最喜欢的日志程序是http://serilog.net/——你可以将日志消息发送到各种级别的任意目的地组合。你调查过https://github.com/serilog/serilog-sinks-raygun吗..还是https://exceptionless.com/pricing/?Serilog的美妙之处在于,你可以添加“sink”并更改配置,而无需修改代码的其余部分...或者用XML表示。出于学术兴趣(我认为它不适用于AutoCAD插件),我使用了两个全局崩溃处理程序,因为异步崩溃需要特殊处理。我使用Serilog,这是我的处理程序...    AppDomain current domain = AppDomain。CurrentDomain。
当前域,unhandled exception+= GlobalCrashHandler;。
调度员,unhandled exception+= ondispatcherunhandled exception;。

//...。

/// 全局崩溃处理程序,。
/// 事件的源,。
/// 未处理的异常事件信息,。
私有静态void GlobalCrashHandler(对象发送方,UnhandledExceptionEventArgs args)。
{。
异常e =(异常)参数,ExceptionObject。
日志,致命的(e,“被全局异常捕捉器捕获。:(");。
close helog();。
}。

/// 引发系统,窗户,穿线。调度程序未处理的异常事件,。
/// 事件的源,。
/// 要发送到已注册事件处理程序的事件信息,。
private static void OnDispatcherUnhandledException(对象发送方,系统。windows . threading . dispatcherunhandledexceptioneventargs e)。
{。
异常ex = e . Exception。
日志,致命的(例如,“被全局调度程序异常捕获器捕获。:(:{InnerException} ",ex。inner exception);。
close helog();。
}。


私有静态void CloseTheLog()。
{。
if(reald ghost,UnresolvedFiles.Any())。
日志,错误(" RealDwg找不到以下文件:{UnresolvedFiles} ",RealDwgHost。未解决的文件);。

日志,信息(“崩溃了,正在关闭tvCADdesktop。抱歉,:(");。
设置,default . Save();。

日志,CloseAndFlush();//https://github . com/seri log/seri log/wiki/life-of-Loggers 。
}...是的,我没有试图活下去,因为如果它走到这一步,我真正想要的是一个验尸,让它活着会弊大于利。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-6-11 02:44:56 | 显示全部楼层

感谢您的输入CADBloke。这也是我的理解,CAD正在捕获错误上升到域级别之前。像你一样,我不担心一旦它到达这些崩溃处理程序就会保存它,更多的是关于有一个好的事后分析。我试图在内部尝试/捕获中捕获更多严重错误。
我会看看serilog,尽管我真正想要的一件事是良好的错误报告,到目前为止,我所看到的解决方案每月都会花费,但比我放在一起的任何东西都写得更好。
回复

使用道具 举报

23

主题

239

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
327
发表于 2016-6-11 12:37:19 | 显示全部楼层
我尝试通过autocad编程中的命令运行所有内容。(大多数东西) 然后,我将所有代码包装在命令中,并尝试捕获,并使用它来捕获我没有处理的任何内容。 相同的方案几乎可以用于任何事情。 不幸的是,它不会捕获所有内容,但它会捕获您未计划的内容。
我也使用serilog来处理几乎所有事情,并通过Seq接收器运行它,以便我可以在浏览器中看到实时更新。 我这样做是为了调试。 在发布模式下,我通过存储在本地计算机上的文件系统运行它,默认日志记录级别为“错误”,而在调试模式下,有一个默认的信息日志记录级别。 所有这些都是使用预处理器指令自动设置的,并且运行良好。 我正在考虑向我的设置文件添加日志记录级别,以便用户可以在极端情况下更改日志记录级别。
回复

使用道具 举报

23

主题

239

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
327
发表于 2016-6-12 19:27:27 | 显示全部楼层

我做了一件非常相似的事情。Seq真棒。对于文本日志,请尝试https://github.com/RolandPheasant/TailBlazer-跟踪日志非常棒(是的,我听说是Linux fanbois)。我同时使用这两种方法,并将文本日志的日志级别设置为低于Seq。在代码中类似于此…
[code=csharp]日志。Logger=new LoggerConfiguration()
。丰富。WithProperty(“应用程序”、“tvCADdesktop”)
.MinimumLevel.Verbose()
.WriteTo.Seq(“http://localhost:5341/“,LogEventLevel.Information)
。写入。文件(AppDataFolder+@“logs\tvCADdesktop.log”)
.CreateLogger()
/..
//
应用程序数据文件夹的路径名-始终具有尾部
\
//
默认值为
%appdata%\CADbloke\tvCADdesktop\”
内部静态字符串AppDataFolder=>Environment.ExpandEnvironmentVariables(@“%appdata%\CADbloke\tvCADdesktop\”
…或这是XML格式的…
您可以将Raygun等水槽添加到您的心脏内容中。总体最低级别跨所有接收器,但每个接收器可以有自己的配置。结构化日志记录在.NET领域正在真正兴起。Serilog的创建者对此有一个很好的介绍:http://nblumhardt.com/2016/06/structured-logging-concepts-in-net-series-1/-尼古拉斯是一个非常好的人,也很聪明:他还创造了http://autofac.org/
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 18:45 , Processed in 0.228210 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表