【发布时间】:2021-02-24 13:34:39
【问题描述】:
我有这个错误,发生在我构建的 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, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, 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)
{
//
}
这样就够了,不行吗?
【问题讨论】:
-
未处理的异常是尚未被捕获的异常,即包装在
try..catch块中.. -
我们可以看看你的
catch吗?有一些异常不能被可靠地捕获(特别是内存不足、堆栈溢出和线程中止),但大多数 : 将被很好地捕获。如果您意外看到异常:您可能没有捕捉到您认为自己捕捉到的内容 -
至于它取消整个过程:是的,如果异常到达堆栈顶部,就会发生这种情况。看起来您在这里运行自己的线程,所以...是的,不要让这种情况(未处理的异常)发生
-
@markzzz 好吧,您添加的代码无法编译 - 至少缺少一个大括号;并且不清楚它们在您的其他代码中的位置,所以......不可能评论
-
@markzzz 这种特殊情况是由于
async void的工作方式以及在async上下文中如何处理异常的组合(它们通常附加到Task不存在的对象async void签名,导致在原始线程中引发异常,无论该线程当时在哪里)。因此,在此示例中,如果您将签名更改为async Task(然后您应该正确地await那个Task。但主要只是举例说明异常可以“绕过”try catch 块。
标签: c# .net iis try-catch unhandled-exception