捕获使 IIS 网站崩溃的 NullReferenceException
catching NullReferenceException that crashes IIS website
我有一个 .Net 4.6 Web 应用程序,它有一个长期但间歇性的问题,即错误发生,总是在同一个地方,导致 IIS 崩溃。
Web 应用程序每天都在使用,但并非每天都会出现此错误。但是当它确实出错并使网站崩溃时,它总是在同一条线上。
这是错误:
[NullReferenceException: 对象引用未设置到对象的实例。]
SecureUserCheck..ctor(数据集 secureData)在 e:\gameServer\SecureUserCheck.vb:160
下面是 "ds" 的初始化方式:
Dim ds As Data.DataSet = Session("secureData")
If IsNothing(ds) Then
ds = getSecureDS(gameID)
Session("secureData") = ds
End If
下面是 SecureUserCheck.vb 第 160 行:
inhSec = New SecureUserCheck(ds)
Public Sub New(ByVal secureData As DataSet)
If secureData Is Nothing Then
Throw New System.ArgumentException("secureData in empty.")
Else
startTime = DateTime.Now
Try
myGameInfo = secureData.Tables("GameInfo") // LINE 160
Catch ex As Exception
Throw New System.ArgumentException("The secureData must contain [GameInfo] table.")
End Try
With myGameInfoRows(0)
...fill variables
End With
我尝试将其包装在 Try Catch 块中,但似乎从未抛出过。该错误仍会弹出并使 IIS 崩溃。
我可以做些什么来检查并确保数据集和数据表存在,或者不为空,以便 IIS 不会崩溃?
谢谢!
首先,你应该使用Option Strict On
。它将帮助您正确匹配所有类型,从而减少错误并加快代码速度。
现在进入正题。如果您可以对程序 运行 时遇到的问题做一些有用的事情,您应该这样做。这种情况下,如果数据已经丢失,可以重新初始化:
Public Sub New()
Dim ds As Data.DataSet
If Session("secureData") Is Nothing Then
ds = getSecureDS(gameID)
Session("secureData") = ds
Else
ds = DirectCast(Session("secureData"), Data.DataSet)
End If
If Not ds.Tables.Contains("GameInfo") Then
Throw New System.ArgumentException("The secureData must contain [GameInfo] table.")
End If
' more code...
End Sub
另请注意检查特定 table 是否存在的简洁方法,尽管我建议它正确地属于 getSecureDS
方法。
如果数据集适用于站点的 所有 用户,您应该考虑使用 System.Runtime.Caching 而不是会话状态。
我有一个 .Net 4.6 Web 应用程序,它有一个长期但间歇性的问题,即错误发生,总是在同一个地方,导致 IIS 崩溃。
Web 应用程序每天都在使用,但并非每天都会出现此错误。但是当它确实出错并使网站崩溃时,它总是在同一条线上。
这是错误:
[NullReferenceException: 对象引用未设置到对象的实例。] SecureUserCheck..ctor(数据集 secureData)在 e:\gameServer\SecureUserCheck.vb:160
下面是 "ds" 的初始化方式:
Dim ds As Data.DataSet = Session("secureData")
If IsNothing(ds) Then
ds = getSecureDS(gameID)
Session("secureData") = ds
End If
下面是 SecureUserCheck.vb 第 160 行:
inhSec = New SecureUserCheck(ds)
Public Sub New(ByVal secureData As DataSet)
If secureData Is Nothing Then
Throw New System.ArgumentException("secureData in empty.")
Else
startTime = DateTime.Now
Try
myGameInfo = secureData.Tables("GameInfo") // LINE 160
Catch ex As Exception
Throw New System.ArgumentException("The secureData must contain [GameInfo] table.")
End Try
With myGameInfoRows(0)
...fill variables
End With
我尝试将其包装在 Try Catch 块中,但似乎从未抛出过。该错误仍会弹出并使 IIS 崩溃。
我可以做些什么来检查并确保数据集和数据表存在,或者不为空,以便 IIS 不会崩溃?
谢谢!
首先,你应该使用Option Strict On
。它将帮助您正确匹配所有类型,从而减少错误并加快代码速度。
现在进入正题。如果您可以对程序 运行 时遇到的问题做一些有用的事情,您应该这样做。这种情况下,如果数据已经丢失,可以重新初始化:
Public Sub New()
Dim ds As Data.DataSet
If Session("secureData") Is Nothing Then
ds = getSecureDS(gameID)
Session("secureData") = ds
Else
ds = DirectCast(Session("secureData"), Data.DataSet)
End If
If Not ds.Tables.Contains("GameInfo") Then
Throw New System.ArgumentException("The secureData must contain [GameInfo] table.")
End If
' more code...
End Sub
另请注意检查特定 table 是否存在的简洁方法,尽管我建议它正确地属于 getSecureDS
方法。
如果数据集适用于站点的 所有 用户,您应该考虑使用 System.Runtime.Caching 而不是会话状态。