Как обрабатывать ошибки внутри блока Catch

В моем приложении я получаю 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

Редко когда вообще нужно выбрасывать NullReferenceException, потому что обычно вы должны сначала проверять, является ли ссылка нулевой, либо явно, путем распространения нуля, либо с помощью оператора If. Вы, очевидно, уже знаете, как это сделать, потому что делаете это на следующей строке, даже если это не лучший способ. Однако могут быть случаи, когда это имеет смысл, и, если это один из них, обработчик исключений внутри блока Catch в порядке.

jmcilhinney 02.07.2019 04:45

Является ли проблема в том, что _client имеет значение null, или проблема в том, что NullRefException вызывается GetErrorResponse? Если последнее, учитывая использование здесь и предполагая, что вы управляете этой функцией, это похоже на ошибку в этой функции, которую она может вызвать. Если первое, проверьте его, а не срабатывайте, когда вы пытаетесь использовать объект.

Craig 02.07.2019 15:42

Кроме того, нет веской причины использовать функцию IsNothing, когда вы можете просто использовать операторную форму Is Nothing. Кроме того, теперь есть оператор IsNot, так что вы можете просто сказать If resultObject.ErrorResponse IsNot Nothing, что намного легче читать.

Craig 02.07.2019 15:44

_client не является нулевым. Эта проблема возникает, когда есть тайм-аут. Считаете ли вы, что добавление третьего блока Catch, например «Catch nullRefEx As NullReferenceException», решит проблему?

Henry 02.07.2019 16:52

Я полагаю, что это решит проблему, но было бы лучше, если бы вы могли сделать так, чтобы NullRefException вообще не было. Проблема должна быть либо внутри GetErrorResponse --- в этом случае я бы порекомендовал исправить GetErrorResponse, чтобы он возвращал что-то полезное вместо выбрасывания --- либо resultObject равно нулю --- в этом случае у вас есть то, что Эрик Липперт вызвал бы тупоголовое исключение, которое легко разрешить без затратной попытки перехвата.

Craig 02.07.2019 22:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
233
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны поймать ошибку внутри блока catch. Это особенно уместно, поскольку код пытается получить больше информации об уже произошедшей ошибке. Конечно, может быть хорошей идеей регистрировать любую возникающую ошибку, даже если приложение может продолжить работу.

Вы предлагаете добавить еще один блок try catch внутри блока Catch? пожалуйста, порекомендуйте

Henry 02.07.2019 17:34

Да, потому что вы пытаетесь получить дополнительную информацию об ошибке. Если это не удается, вы хотите игнорировать его.

RobertBaron 02.07.2019 17:41

Как и выше, первое, что вы должны попытаться сделать, это устранить исключение. Только если это невозможно, вы должны прибегнуть к добавлению дополнительного try-catch внутри catch.

Craig 02.07.2019 22:02

Другие вопросы по теме