Почему в моем try-catch выдается ошибка? - PullRequest
1 голос
/ 23 апреля 2010

Почему мой блок try-catch все еще выдает ошибку при обработке?

Сведения об исключении: System.NullReferenceException: объект ссылка не установлена ​​на экземпляр объект.

              Try
    Here >> :   _MemoryStream.Seek(6 * StartOffset, 0)
                _MemoryStream.Read(_Buffer, 0, 6)
              Catch ex As IOException
                // Handle Error
              End Try

Редактировать: Очистить вопрос, чтобы удалить постороннюю информацию.

Ответы [ 8 ]

6 голосов
/ 23 апреля 2010

Так как блок try / catch захватывает только IOException, он не поймает NullReferenceException.

Это, вероятно, указывает на какую-то логическую ошибку в программе за пределами кода, который вы разместили. И для записи, за этим исключением, программа не должна молча терпеть неудачу - это, скорее всего, ошибка в коде или способе использования библиотеки (хотя, вероятно, это должно было быть обработано библиотека), не проблема со средой выполнения.

6 голосов
/ 23 апреля 2010

приложение взрывается на линия внутри блока try-catch. любой Идея, почему это будет происходить? Разве это не должно просто молча провалиться?

Почему вы думаете, что исключение не может возникнуть в try / catch? Вся цель блока try.catch - определить, как вы собираетесь обрабатывать исключительные ситуации. Если нет блока catch, соответствующего типу создаваемого исключения, исключение будет распространяться до тех пор, пока какой-либо код его не перехватит или пока оно не будет поднято как необработанное.

Конечно, можно использовать Catch ex as Exception в качестве блока, чтобы перехватить все исключения и затем проглотить их, но это редко хорошая идея.

Что касается NullReferenceException, вам почти никогда не захочется ловить их и обращаться с ними (почти никогда). Они обычно указывают на то, что где-то в коде есть ошибка, когда логика не проверяет ссылку на null перед доступом к методам или свойствам в ней. Фактически, вполне вероятно, что переменная _MemoryStream сама является виновником - если она равна нулю, то вызов ее вызова вызовет именно это исключение.

1 голос
/ 23 апреля 2010

Я не эксперт vb.net, но исключение с нулевой ссылкой не является IOException, поэтому исключение проваливается и не должно отслеживаться на более высоком уровне. Если вы воспринимаете IOException как исключение, это должно сработать, хотя и не является наилучшей практикой.

1 голос
/ 23 апреля 2010

Это происходит потому, что вы перехватываете только исключения типа System.IOException, а выбрасываемым исключением является исключение System.NullReferenceException. Чтобы поймать это, вам нужно сделать это:

Try
   _MemoryStream.Seek(6 * StartOffset, 0)
   _MemoryStream.Read(_Buffer, 0, 6)
Catch ex As IOException

Catch ex As NullReferenceException
   ' Exception would be caught and handled here.
End Try
1 голос
/ 23 апреля 2010
  1. Try-Catches, как правило, не о сбое в молчании. Просто чтобы прояснить это.

  2. Является ли _MemoryStream нулевым (или Nothing) в этой точке кода? try-catch практически никогда не должен использоваться для обработки NullReferenceException.
    в этом случае он не перехватывает NullReferenceException, потому что NullReferenceException не является IOException.

0 голосов
/ 23 апреля 2010

Catch ловит IOException (только).Выдается исключение NullReferenceException.

0 голосов
/ 23 апреля 2010

Нельзя сказать, что улов ловит все исключения; оно может быть ограничено определенным классом исключений, который не распространяется на этот класс. Даже если он поймает этот класс исключений, он может перебросить его. Если все сделано правильно (то есть throw;), re-throw покажет исключение в виде броска в строку внутри улова, который первым вызвал исключение.

0 голосов
/ 23 апреля 2010

Поскольку создаваемое исключение не является IOException. Вам нужно поймать все исключения.

...