我已经开发了vb.net服务 此服务是从Windows应用程序安装的,该应用程序在服务启动后立即关闭 在服务内部,我有一个过程“Protected Overrides Sub OnCustomCommand “,这个程序工作正常,直到指针到达我在下面给你的指令:
Protected Overrides Sub OnCustomCommand(ByVal command As Integer)
StartLogFile("Custom Command {" & command & "} invoked", EventLogEntryType.Information)
Dim Position As String
Dim myFile As String = Nothing
Dim myTime As String = Nothing
Try
If command = SimpleServiceCustomCommands.StartWorker Then
Position = "GetKeyValue Time"
myTime = GetKeyValue("Time", "", RegPath)
Position = "GetKeyValue Name"
myFile = GetKeyValue("Name", "", RegPath)
StartLogFile("Notice OnCustomCommand" & vbNewLine & "MyTime= { " & myTime & "}, {MyFile= { " & myFile & "} ", EventLogEntryType.Error)
.
.
.
Catch ex As Exception
StartLogFile("Error OnCustomCommand" & vbNewLine & Position & vbNewLine & ex.StackTrace, EventLogEntryType.Error)
Finally
End Try
我根据我阅读的通知做了一些更改,现在 GetKeyValue 没有给我任何错误。但要么没有给我任何价值。
Get函数如下:
Public Function GetKeyValue(ByVal nKey As String, ByVal vKey As String, ByVal sPath As String) As String
Dim RegKey As RegistryKey
Dim kValue As String = Nothing
Dim Pos As String
If RegKeyExists(sPath) Then
Try
RegKey = Registry.CurrentUser.OpenSubKey(sPath, True)
kValue = CStr(RegKey.GetValue(nKey))
Catch ex As Exception
StartLogFile(" GetKeyValue, RegKeyExists(sPath) " & vbNewLine & "{ RegKey= " & RegKey.Name & "}, { kValue= " & kValue & "}, { nKey= " & nKey & "}" & vbNewLine & "Stack Trace= " & ex.StackTrace, EventLogEntryType.Warning)
End Try
End If
Return kValue
End Function
现在我拥有的是:
无错误,无值
!!!!
答案 0 :(得分:5)
你的代码显然没有在GetKeyValue()里面的try-catch语句中失败,因为那时你会从日志中看到错误来自该函数本身。
因此,您的代码必须要么在“False”情况下失败,要么在“True”case的catch块中形成StartLogFile()调用。
请注意,您的日志语句中有RegKey.Name
,而RegKey
非常明显null
,因为您从未设置过它(仅在True情况下设置)。我认为这是你的错误所在。
“True”情况下的catch块不会访问任何可能为null的变量的任何属性。但是,StartLogFile本身可能会在内部 中失败。
我感觉你已经交换了两个StartLogFile()调用(假的情况应该在True案例的catch块中,而True案例的catch块中的那个应该是假的情况)。
此外,即使在True case块中,您也不能认为RegKey
是非空的,因为Registry.CurrentUser.OpenSubKey
可能会失败并且您将无法理解错误的位置,因为您的try-catch块捕获了错误,它在错误记录语句中失败了!这种类型的bug可能非常令人沮丧,特别是在大型系统中。士气:永远不要让你的错误记录代码太复杂 - 如果它们失败了,它们很难找出发生了什么。
另外,有没有理由在错误记录中不包含堆栈跟踪?堆栈跟踪将立即指向您的问题代码行。
答案 1 :(得分:1)
我认为您可能会将无效路径传递给所需的注册表项(RegPath
)。在GetKeyValue
函数中,如果RegKeyExists
返回False
,则StartLogFile
的调用会引用RegKey
此时仍为Null
- 因此你得到的错误。
在该行中,将RegKey.Name
替换为sPath
,您至少应该在日志文件中看到原始错误。或者只是确保你有正确的路径。