未处理的异常会绕过 try/catch 块吗?

问题描述

我有这个错误,它发生在我构建的 webapi 上:

An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/1/ROOT/MyWebAPI

Process ID: 43144

Exception: IBM.Data.DB2.iSeries.iDB2sqlErrorException

Message: SQ20377 Character X'  3F' cannot be mapped to a valid XML character.

StackTrace:    at IBM.Data.DB2.iSeries.iDB2Exception.throwDcException(MpDcErrorInfo mpEI,MPConnection conn)
   at IBM.Data.DB2.iSeries.iDB2Command.reportDCError(Int32 rc)
   at IBM.Data.DB2.iSeries.iDB2Command.fetch()
   at IBM.Data.DB2.iSeries.iDB2DataReader.MPDataReader.FetchData(UInt32& rowsReturned,UInt32& blockNumber)
   at IBM.Data.DB2.iSeries.iDB2DataReader.MPDataReader.FetchThread()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,Object state)
   at System.Threading.ThreadHelper.ThreadStart()

对 DB2 的每个查询都会被捕获,因此应该记录和管理任何错误。但相反,由于这些错误,整个应用程序池“有时”(并非总是)会宕机。

我说有时是因为事件查看器上的一些错误(相同)已被记录,但不要停止 IIS 池。

运行 .NET v4.0。

它可以是什么?可以绕过 try/catch 吗?好奇怪……

编辑:

大多数 try/catch 都是通用的:

try
{

}
catch (Exception ex)
{

}

有些是具体的,例如:

int rowCount = 0;
sqlBuilder.Template template = null;

try
{
    template = CreatesqlTemplate(filters,"rowcount");

    using (iDB2Connection db2 = new iDB2Connection(Properties.Settings.Default.AS400Connection))
    {
        var rowCounts = db2.Query<int>(template.Rawsql,template.Parameters);
        rowCount = rowCounts.Count() > 0 ? rowCounts.First() : 0;
    }
}
catch(iDB2sqlErrorException db2sqlex)
{
    //
}
catch (Exception ex)
{
    //
}

这就够了,不是吗?

解决方法

您尝试在连接字符串中设置 EnablePreFetch=false 吗?

https://www.ibm.com/mysupport/s/question/0D50z000060GNJx/threading-issue?language=en_US

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8f487219-22ad-48cc-b743-aa15c8d7dd4f/threading-exception?forum=clr

,

.NET Framework 提供了几个事件,可用于捕获未处理的异常。当您的应用程序启动时,您只需在代码中注册一次这些事件。对于 ASP.NET,您可以在 Startup 类或 Global.asax

中执行此操作
static void Application_ThreadException(object sender,ThreadExceptionEventArgs e)
{
     // Log the exception,display it,etc
     Debug.WriteLine(e.Exception.Message);
}

static void CurrentDomain_UnhandledException(object sender,UnhandledExceptionEventArgs e)
{
     // Log the exception,etc
     Debug.WriteLine((e.ExceptionObject as Exception).Message);
}
,

您是否尝试过订阅此活动? TaskScheduler.UnobservedTaskException Event

此行为自 .NET Framework 4.5 起已更改,但您可以启用它以获取有关此异常来源的更多详细信息。

该事件是一个静态事件,建议您在申请开始时尽快订阅该事件。

不要错过编辑配置文件

<runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>

这是一个使用示例 tpl-exception-handling

注意这一点Release mode

希望能帮到你

,

尝试在您的数据库连接中打开连接池:

var connb = new DB2ConnectionStringBuilder(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
connb.Pooling = true;
connb.MinPoolSize = 1;
connb.MaxPoolSize = 100;
var conn = new DB2Connection(connb.ConnectionString);

如果您不能或不想这样做,请确保在完成后明确关闭与数据库的每个连接。否则,当垃圾收集器收集您打开的连接对象时,可能会抛出未处理的异常。之前在 DB2 提供程序中已观察到此问题。

,

根据堆栈跟踪,此异常发生在 DB2 自动创建的线程中。它不会运行您的任何代码,因此您无法使用 try 块捕获此异常。

  1. 配置 Visual Studio 调试器以在出现未处理的异常时中断。
  2. 试着找出那个看起来很奇怪的角色来自哪里。 3F 前面的那两个空白看起来很可疑。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...