В экземпляре объекта не задана ссылка на объект - PullRequest
1 голос
/ 20 марта 2011

Я разработал сервис с vb.net.
Эта служба была установлена ​​из приложения Windows, которое закрывается сразу после запуска службы.
Внутри сервиса у меня есть процедура «Защищенные переопределения 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

Теперь у меня есть:
Нет ошибок, нет значений
!!!!

Ответы [ 2 ]

5 голосов
/ 20 марта 2011

Ваш код, очевидно, не завершился с ошибкой внутри оператора try-catch внутри GetKeyValue (), потому что из журнала вы увидите, что ошибка возникла внутри самой функции.

Таким образом, ваш код должен либо давать сбой в «ложном» случае, либо формировать вызов StartLogFile () в блоке catch «истинного» случая.

Ложный случай

Обратите внимание, что у вас есть RegKey.Name в вашем операторе журнала, и RegKey очень очевидно null, потому что вы никогда не устанавливаете его (оно устанавливается только в случае True). Я думаю, что здесь ваша ошибка.

Блок-загадка True Case

Блок catch в вашем "True" случае не имеет доступа ни к какому свойству любой переменной, которая может быть нулевой. Тем не менее, сам StartLogFile может не работать с таким исключением внутри .

Сменные операторы

У меня такое ощущение, что вы поменялись местами двумя вызовами StartLogFile () (ложный случай должен быть в блоке перехвата истинного случая, а тот, что в блоке перехвата истинного случая, должен быть в ложном случае ).

Избегайте регистрации ошибок, которая сама может завершиться сбоем

Кроме того, даже в блоке True case вы не можете предполагать, что RegKey не является нулевым, потому что Registry.CurrentUser.OpenSubKey может дать сбой, и вы не поймете, где находится ошибка, потому что ваш блок try-catch обнаруживает ошибку и ее вместо этого в вашем операторе регистрации ошибок! Этот тип ошибки может быть очень сложно найти, особенно в больших системах. Мораль: никогда не делайте ваш код регистрации ошибок слишком сложным - если они терпят неудачу, они затрудняют выяснить, что случилось.

Всегда включать трассировку стека в журнал ошибок

Кроме того, есть ли причина, по которой вы не включаете трассировку стека в журнал ошибок? Наличие трассировки стека немедленно укажет вас на строку кода проблемы.

1 голос
/ 20 марта 2011

Я думаю, что вы можете передать неверный путь к нужному разделу реестра (RegPath).В вашей функции GetKeyValue, если RegKeyExists возвращает False, то вызов StartLogFile ссылается на RegKey, который все еще равен Null на данный момент - следовательно, вы получаете ошибку.

В этой строке замените RegKey.Name на sPath, и вы должны хотя бы увидеть исходную ошибку в файле журнала.Или просто убедитесь, что у вас правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...