.NET 1.1中未处理的异常处理程序

我维护一个.NET 1.1应用程序,我负责的一件事是确保用户没有看到任何不友好的错误通知。

我已经为 Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException 添加了处理程序,它们被调用。我的问题是仍然显示标准的CLR错误对话框(在调用异常处理程序之前)。

杰夫在他的博客此处这里。但是没有解决办法。那么.NET 1.1中的标准方式是处理未捕获的异常并显示一个友好的对话框?

Jeff的回答被标记为正确答案,因为他提供的链接提供了关于如何完成所需内容的最完整信息。

0
额外 编辑
意见: 1
如果您认为此帖已回复,请标记为答案。
额外 作者 Anonymous User,

8 答案

除了Jaap提到的ULS日志外,您还可以在“应用程序”事件日志中找到相关信息。

您可以在管理工具中找到事件查看器,或者直接在运行中写入eventvwr.exe。

Theres在Codeplex上也有很多项目,这对管理ULS日志文件很有帮助。只需在Codeplex.com上搜索ULS即可

最后,我可以推荐Hristo Pavlov使用 SPTraceView ,它可以让你实时发生ULS事件。进行生产调试时特别强大。它也可以与 DebugView 结合使用。

EDIT: A good blog post on all the logs of SharePoint: How do i troubleshoot SharePoint? So many logs!

8
额外
统一日志记录服务
额外 作者 Anonymous User,
ULS日志是SharePoint在执行其API时将数据写入的跟踪日志。您可以在CA>操作>诊断日志记录中分别针对不同类别为ULS和事件日志设置跟踪级别。请注意,如果将日志级别设置得太高,它可能会影响性能和存储。在调试问题的情况下,您可以将它们设置为详细,然后将它们设置回中。阅读更多信息: technet.microsoft.com/en-us/library/cc288649.aspx weblogs.asp.net/erobillard/archive/2008/07/31/…
额外 作者 Anonymous User,
ULS是简称?
额外 作者 engtech,
什么是统一日志记录服务?某些特定于SharePoint Server的东西?你有更多的文件要阅读吗?
额外 作者 engtech,

ULS日志由服务器在以下文件夹中生成:

C:\ Program Files \ Common Files \ Microsoft Shared \ web server extensions \ 12 \ LOGS

您可以通过Central Admin修改记录级别,例如更详细或更不详细。

添加一个“12蜂巢”工具栏到开始栏,以便您可以轻松访问驻留在12配置单元中的日志和SharePoint的其余所有内容。

此外还有开源工具,可让您通过友好的用户界面查看日志。一个例子是 WSS/MOSS日志文件阅读器,由斯图尔特Starrs

4
额外
将这些日志文件从C:移入数据驱动器也是一个好主意:-)您可以在管理中心中确定诊断和跟踪日志文件路径
额外 作者 Anonymous User,
这是因为跟踪日志不断被共享点写入
额外 作者 Anonymous User,
当我查看最新的文件日志时,遇到了错误 - 文件正在被其他进程使用。任何想法有什么不对?
额外 作者 engtech,
MS还在这里发布了他们的ULS Viewer工具 code.msdn.microsoft.com/ULSViewer
额外 作者 Alex Angas,
@AlexAngas ULS Viewer链接不再好。 (5年后,那是......)
额外 作者 bgmCoder,
@BGM现在重新发布: microsoft.com/en- us/download/details.aspx?id = 44020 。奇怪的时机...
额外 作者 Alex Angas,
@AlexAngas感谢您的链接更新!
额外 作者 bgmCoder,

“服务器在尝试从数据源获取数据时返回了非特定错误,请检查查询的格式和内容,然后重试,如果问题仍然存在,请联系服务器管理员。错误是SharePoint Designer错误,您不可能在日志中看到任何有关此错误的信息。

If you are only doing Data View -> Insert Dataview and getting this error, I'd be surprised. Are you doing anything else before you get the error? It could be that you are trying to insert the Dataview in a part of the page where it cannot be, such as inside another control.

1
额外
你应该创建一个新的话题,如果你想回答这个错误是什么。这个问题是关于一般的伐木问题。
额外 作者 Anonymous User,
Hi Marc,我将Dataview拖入WebPart布局页面(根据布局创建一个新的空白Web部件页面)。我可以将Dataview拖入WebPart吗?
额外 作者 engtech,
在这种情况下,我已经得到了这个 - 通常需要在已经有很多项目和工作流程以及其他乐趣的列表中添加一个查找字段 - 这是SP不喜欢的奇怪组合。移除测试项目使世界上的一切都变得恰到好处。
额外 作者 ebruchez,

这是一个控制台应用程序还是Windows窗体应用程序?如果它是一个.NET 1.1控制台应用程序,可悲的是,这是由设计 - 这是由MSFT开发人员在您引用的第二篇博文

顺便说一句,在我的1.1机器上,来自MSDN的例子确实有预期的输出;只是第二行直到你连接了一个调试器(或没有)之后才显示出来。在第2版中,我们翻转了所有东西,以便UnhandledException事件在调试器附着之前触发,这似乎是大多数人的期望。

这听起来像.NET 2.0更好(谢天谢地),但说实话,我从来没有时间回去检查。

0
额外

哦,在Windows窗体中,你绝对应该能够使它工作。唯一需要注意的是不同线程上发生的事情。

我在这里有一个旧的代码项目文章应该有所帮助:

用户友好的异常处理

0
额外

这是一个Windows窗体应用程序。由Application.ThreadException捕获的异常工作正常,并且我没有遇到丑陋的.NET异常框( OK 终止, Cancel 调试?接着就,随即??)。

我收到了一些未被捕获的异常,并最终导致了导致问题的AppDomain.UnhandledException事件。我想我已经发现了大部分例外情况,现在我将它们显示在我们的错误框中。

所以我只需要希望没有其他一些情况会导致异常无法被Application.ThreadException处理程序捕获。

0
额外

AppDomain.UnhandledException is an event, not a global exception handler. This means, by the time it is raised, your application is already on its way down the drain, and there is nothing you can do about it, except for doing cleanup and error logging.

幕后发生的事情是:框架检测到异常,将调用堆栈放到最顶层,发现没有处理程序可以从错误中恢复,因此无法确定继续执行是否安全。因此,它启动了关机程序,并向您发起了此活动,以便您可以向您已经注定的进程致敬。当主线程中发生异常时,会发生这种情况。

这种错误没有单点解决方案。您需要在发生此错误的所有位置上游放置一个真正的异常处理程序(catch块),并将其转发给(例如)全局处理程序方法/类,以确定是否安全地报告并继续,基于例外类型和/或内容。

编辑:可以禁用(=破解)Windows内置的错误报告机制,以便在应用程序关闭时不会显示强制性的“崩溃和刻录”对话框。但是,这对于系统中的所有应用程序都是有效的,而不仅仅是您自己的。

0
额外

.NET 1.x Windows窗体应用程序中未处理的异常行为取决于:

  • 抛出异常的线程类型
  • 是否在窗口消息处理期间发生
  • 调试器是否附加到流程
  • DbgJitDebugLaunchSetting注册表设置
  • App.Config中的jitDebugging标志
  • 是否覆盖Windows窗体异常处理程序
  • 您是否处理了CLR的异常事件
  • 月相

未处理的异常的默认行为是:

  • 如果在抽取窗口消息时主线程发生异常,它将被Windows窗体异常处理程序拦截。
  • 如果在抽取窗口消息时主线程发生异常,它将终止应用程序进程,除非它被Windows窗体异常处理程序拦截。
  • 如果在手动,线程池或终结器线程中发生异常,它将被CLR吞噬。

未处理的异常的联系点是:

  • Windows窗体异常处理程序。
  • JIT调试注册表开关DbgJitDebugLaunchSetting。
  • CLR未处理的异常事件。

Windows窗体内置的异常处理在默认情况下执行以下操作:

  • Catches an unhandled exception when:
    • exception is on main thread and no debugger attached.
    • exception occurs during window message processing.
    • jitDebugging = false in App.Config.
  • Shows dialog to user and prevents app termination.

您可以通过在App.Config中设置jitDebugging = true来禁用后者。但请记住,这可能是您停止应用程序终止的最后机会。因此,捕获未处理的异常的下一步是注册事件Application.ThreadException,例如:

Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);

请注意HKEY_LOCAL_MACHINE \ Software.NetFramework下的注册表设置DbgJitDebugLaunchSetting。这是我知道的三个价值之一:

  • 0:显示要求“调试或终止”的用户对话框。
  • 1:让CLR处理异常。
  • 2:启动在DbgManagedDebugger注册表项中指定的调试器。

在Visual Studio中,转到菜单工具选项调试JIT 将此键设置为0或2.但在最终用户的机器上,值1通常最好。请注意,此注册表项在CLR未处理的异常事件之前执行。

这最后一个事件是您最后一次记录未处理异常的机会。它在Finally块执行之前触发。您可以按如下截取此事件:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
0
额外