В моем приложении я получаю System.NullReferenceException для моего вызова REST. Эта ошибка вызвана кодом внутри блока Catch. Стоит ли помещать еще один блок try catch внутрь блока Catch? В приведенном ниже коде следующая строка кода в блоке Catch вызывает ошибку.
resultObject.ErrorResponse = _client.GetErrorResponse(Of List(Of ErrorResponseObject))(ex, "{""errors"":")
Как мне исправить эту проблему, чтобы пользователь не видел никакой ошибки. Вот мой код.
Public Shared Function POSTCall()
_client = New BaseClient()
Try
strJsonResponse = _client.ExecuteURI(serviceUrl, requestHeader, "POST", resultObject, False, False)
Catch ex As WebException
resultObject.ErrorResponse = _client.GetErrorResponse(Of List(Of ErrorResponseObject))(ex, "{""errors"":") 'This line causing error
If Not IsNothing(resultObject.ErrorResponse) Then
' do some work
End If
Catch Exp As Exception
'Supress the error. Let user goto next step.
Finally
_client = Nothing
End Try
Return resultObject
End Function
Является ли проблема в том, что _client имеет значение null, или проблема в том, что NullRefException вызывается GetErrorResponse? Если последнее, учитывая использование здесь и предполагая, что вы управляете этой функцией, это похоже на ошибку в этой функции, которую она может вызвать. Если первое, проверьте его, а не срабатывайте, когда вы пытаетесь использовать объект.
Кроме того, нет веской причины использовать функцию IsNothing, когда вы можете просто использовать операторную форму Is Nothing. Кроме того, теперь есть оператор IsNot, так что вы можете просто сказать If resultObject.ErrorResponse IsNot Nothing, что намного легче читать.
_client не является нулевым. Эта проблема возникает, когда есть тайм-аут. Считаете ли вы, что добавление третьего блока Catch, например «Catch nullRefEx As NullReferenceException», решит проблему?
Я полагаю, что это решит проблему, но было бы лучше, если бы вы могли сделать так, чтобы NullRefException вообще не было. Проблема должна быть либо внутри GetErrorResponse --- в этом случае я бы порекомендовал исправить GetErrorResponse, чтобы он возвращал что-то полезное вместо выбрасывания --- либо resultObject равно нулю --- в этом случае у вас есть то, что Эрик Липперт вызвал бы тупоголовое исключение, которое легко разрешить без затратной попытки перехвата.





Вы должны поймать ошибку внутри блока catch. Это особенно уместно, поскольку код пытается получить больше информации об уже произошедшей ошибке. Конечно, может быть хорошей идеей регистрировать любую возникающую ошибку, даже если приложение может продолжить работу.
Вы предлагаете добавить еще один блок try catch внутри блока Catch? пожалуйста, порекомендуйте
Да, потому что вы пытаетесь получить дополнительную информацию об ошибке. Если это не удается, вы хотите игнорировать его.
Как и выше, первое, что вы должны попытаться сделать, это устранить исключение. Только если это невозможно, вы должны прибегнуть к добавлению дополнительного try-catch внутри catch.
Редко когда вообще нужно выбрасывать
NullReferenceException, потому что обычно вы должны сначала проверять, является ли ссылка нулевой, либо явно, путем распространения нуля, либо с помощью оператораIf. Вы, очевидно, уже знаете, как это сделать, потому что делаете это на следующей строке, даже если это не лучший способ. Однако могут быть случаи, когда это имеет смысл, и, если это один из них, обработчик исключений внутри блокаCatchв порядке.