Механизм обработки исключений Java - PullRequest
1 голос
/ 09 сентября 2010

В Java, если я не перехватил выброшенное исключение, тогда выполнение потока останавливается там, если я перехватываю то же самое, то выполнение потока продолжается после блока перехвата.

Thx

Ответы [ 2 ]

5 голосов
/ 09 сентября 2010

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

Есть два способа, которыми это может закончиться: вы обрабатываете исключение (через перехватблок), или вся программа останавливается.

Если ваша программа не знает, что делать, когда это происходит, лучше всего ничего не делать.Пусть исключение завершит работу потока, а затем вы сможете проверить журнал сбоя и выяснить, что именно привело к сбою программы и почему.Если ваша программа не может обработать ошибку, поведение Exception «crash the thread» позволяет вам увидеть, какая ошибка была обработана, поэтому вы можете изменить программу, чтобы она могла обрабатывать подобные ситуации в будущем или предотвратить ситуациюот возникновения.

Некоторые ошибки могут быть довольно нормальными, однако, и не должны останавливать всю программу - у вас должен быть способ исправить их.Вот для чего нужен блок catch: возможность сказать «Здравствуйте, Java, я знаю, что делать с этой проблемой», а затем сделать это.Блок Catch позволяет вам очистить программу и двигаться дальше, если вы можете.Java предполагает, что ваш блок Catch решает проблему и устраняет ее.Если есть новая проблема, или, если уж на то пошло, та же самая, вам нужно снова throw поймать исключение или, может быть, новую, чтобы кто-то еще мог попытаться решить проблему - даже если это что-то другое вы, какпрограммист.

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

1 голос
/ 09 сентября 2010

В Java, если я не перехватил выброшенное исключение, выполнение потока останавливается там, если я перехватываю то же самое, выполнение потока продолжается после блока перехвата.

Есть третий случай. Если поток имеет Thread.UncaughtExceptionHandler (зарегистрированный с помощью вызова thread.setUncaughtExceptionHandler(handler)), то он будет уведомлен в случае возникновения необработанного исключения в стеке потока ... до нить выходит. (На самом деле, поведение немного сложнее, чем это; см. Javadocs.)

Почему обработка исключений Java разработана таким образом.

Потому что альтернатива намного хуже ... в большинстве случаев.

Если предположить, что поток вызвал завершение метода run() (потому что вы не уловили исключение), то единственное, что вы можете сделать "не остановить", это снова вызвать вызов инфраструктуры потока run() .

Но неисследованное исключение обычно означает, что произошло ПЛОХО. Типичные run() методы не предназначены, поэтому их многократное применение будет полезным. И если метод run() просто не удался по какой-то неизвестной причине (что касается метода run()), еще менее вероятно, что его повторный вызов будет работать.

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

Единственное, что может быть немного сомнительным в текущем дизайне, это то, что завершение потока из-за необработанного исключения часто молчит. Но лекарство от этого заключается в реализации обработчика необработанных исключений по умолчанию, который создает некоторый шум ....

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