问题描述
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
,.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
块捕获此异常。
- 配置 Visual Studio 调试器以在出现未处理的异常时中断。
- 试着找出那个看起来很奇怪的角色来自哪里。
3F
前面的那两个空白看起来很可疑。