3

我有一个 .Net/c# 2.0 windows 服务。入口点包含在一个 try catch 块中,该块通知我出现问题并允许服务继续正常运行,但是当我查看服务器的应用程序事件日志时,我看到许多导致服务终止的“EventType clr20r3”错误不料。catch 块有一个“catch (Exception ex)”并且不会重新抛出异常。

每个 sql 命令的类型都是“CommandType.StoredProcedure”,并使用 SqlDataReader 执行。这些 sproc 调用在 99% 的时间内都能正常运行,并且都经过了彻底的单元测试、分析和 QA。我另外将这些调用包装在 try catch 块中以确保并且仍然遇到这些未处理的异常。

这仅在我们的生产环境中,不能在我们的开发或登台环境中复制(即使在重负载下)。

为什么我的错误处理不能捕捉到这个特定的错误?无论如何,是否可以捕获有关问题根本原因的更多细节?

以下是事件日志的示例:

EventType clr20r3, P1 RDC.OrderProcessorService, 
P2 1.0.0.0, 
P3 4ae6a0d0, 
P4 system.data, 
P5 2.0.0.0, P6 4889deaf, 
P7 2490, 
P8 2c, 
P9 system.data.sqlclient.sql, 
P10 NIL.

此外

The Order Processor service terminated unexpectedly.  
It has done this 1 time(s).  
The following corrective action will be taken in 60000 milliseconds: 
Restart the service.
4

2 回答 2

4

从评论中回答。很高兴有帮助。:)

您是否尝试过添加 AppDomain.UnhandledException 事件处理程序?msdn.microsoft.com/en-us/library/... 几乎问题在于您的代码中某处有未处理的 SQL 异常。

不一定,但是如果没有看到您的代码或您正在使用的库,则无法知道异常是否发生在不同的线程、第三方库等中……通过连接 AppDomain.UnhandledException 处理程序,您至少应该能够记录异常详细信息并找出问题所在。只需将 EventArg 转换为 ((Exception)e.ExceptionObject).Message ,您至少应该更好地了解未处理的异常在哪里。

于 2010-04-29T19:37:15.517 回答
1

此错误很可能发生在您的入口点以外的线程上。

您还需要以某种方式为您的后台线程定义异常处理。

如果您使用 WCF 来包装您的服务,您可以定义如何处理错误和其他异常。这是您托管服务的方式吗?

编辑:如果您没有异步生成任何东西,并且它不是 WCF/etc 应用程序,请尝试处理 AppDomain.UnhandledException 并在那里记录详细错误。

于 2010-04-29T16:46:18.437 回答