gpt4 book ai didi

c# - 异常记录中的空引用异常屏蔽真错误

转载 作者:行者123 更新时间:2023-11-30 22:23:45 26 4
gpt4 key购买 nike

我们有一个由网络请求启动的长时间运行的流程。为了让进程有时间完成,我们将其分离到一个新线程上,并使用互斥锁来确保进程只有一个实例可以运行。此代码在我们的开发和暂存环境中按预期运行,但在我们的生产环境中失败并出现 Null Reference Exception。我们的应用程序日志记录没有捕获任何内容,我们的操作人员报告说它正在使 AppPool 崩溃。 (这似乎是一个环境问题,但我们必须假设环境配置相同。)到目前为止,我们无法确定空引用在哪里。

这是应用程序事件日志中的异常:

Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
StackTrace: at Jobs.LongRunningJob.DoWork()
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

下面是代码(经过稍微净化):

public class LongRunningJob: Job
{
private static Mutex mutex = new Mutex();

protected override void PerformRunJob()
{
var ts = new ThreadStart(LongRunningJob.DoWork);
var thd = new Thread(ts);
thd.IsBackground = true;
thd.Start();
}

private static void DoWork()
{
var commandTimeOut = 180;

var from = DateTime.Now.AddHours(-24);
var to = DateTime.Now;

if (mutex.WaitOne(TimeSpan.Zero))
{
try
{
DoSomethingExternal(); // from what we can tell, this is never called
}
catch (SqlException sqlEx)
{
if (sqlEx.InnerException.Message.Contains("timeout period elapsed"))
{
Logging.LogException(String.Format("Command timeout in LongRunningJob: CommandTimeout: {0}", commandTimeOut), sqlEx);
}
else
{
Logging.LogException(String.Format("SQL exception in LongRunningJob: {0}", sqlEx.InnerException.Message), sqlEx);
}
}
catch (Exception ex)
{
Logging.LogException(String.Format("Error processing data in LongRunningJob: {0}", ex.InnerException.Message), ex);
}
finally
{
mutex.ReleaseMutex();
}
}
else
{
Logging.LogMessage("LongRunningJob is already running.");
}
}
}

最佳答案

为了找到 NullReferenceException,您基本上需要检查每个取消引用操作。我只能看到以下可疑的:

ex.InnerException.Message

您不能假定 ex.InnerException 不为空。

关于c# - 异常记录中的空引用异常屏蔽真错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com