Изключение срещу грешка
Неочаквано поведение може да възникне, когато се изпълнява програма. Това може да се дължи на изключения или грешки. Изключение правят събития, които могат да нарушат нормалния поток на програмата. Грешките са условия, които могат да се считат за невъзстановими. Изключенията са свързани най-вече със самото приложение, докато грешките са свързани със системата, на която се изпълнява програмата.
Какво е изключение?
Изключение е събитие, което може да наруши нормалния поток на програмата. Името изключение идва от „изключително събитие“. Хвърлянето на изключение е процесът на създаване на обект на изключение и предаването му на системата за изпълнение. Обектът за изключение се създава от метода, в който е възникнало изключението. Обектът за изключение съдържа полезна информация като типа и описанието на изключението. Когато системата за изпълнение получава обект на изключение, той ще се опита да намери някой, който да се справи с него в стека на повикването, като го пресича в обратен ред (в който методите са били извикани). Стека на повикванията е подреден списък от методи, които са били извикани преди метода, в който е възникнало изключението. Системата за изпълнение е успешна, ако намери метод с обработчик на изключения. Манипулаторът на изключенията е блок от код, който може официално да обработва споменатото изключение. Ако системата за изпълнение намери подходящ манипулатор (т.е. тип изключение съвпада с типа, който може да се обработва), той ще предаде обекта на изключение на обработващия. Това се нарича улавяне на изключението. Ако обаче изключението не може да бъде обработено, програмата ще бъде прекратена. В Java изключенията наследяват от „клас подхвърляне“. NullPointerException и ArrayIndexOutOfBoundsException са две често срещани изключения в Java.
Какво е грешка?
Грешката е състояние, което може да се счита за невъзстановимо, като програмата, изискваща обем памет, по-голям от наличния. Тези грешки не могат да бъдат обработени по време на изпълнение. Ако възникне грешка, програмата ще се прекрати. В Java грешките наследяват от клас Throwable. Грешките обикновено представляват сериозни проблеми, които програмистът (или приложението) не трябва да се опитва да намери. Грешките са просто ненормални условия, които никога не се очаква да възникнат при нормални обстоятелства и следователно никога не са предвидени. Например OutOfMemoryError, StackOverflowError и ThreadDead са такива грешки. Методите никога не трябва да имат манипулатори за грешки.
Каква е разликата между Изключение и Грешка?
Както грешките, така и изключенията са нежелани явления по време на изпълнение на програма. Те обаче имат ключови разлики. Изключения могат да се предвидят от програмиста, докато грешка е трудно да се предвиди. Изключенията могат да бъдат проверявани или непроверени. Но грешките винаги са непроверени. Изключенията обикновено показват грешка, причинена от програмиста. Грешки обаче възникват поради системна грешка или неправилно използване на ресурс. Следователно изключенията трябва да се обработват на ниво приложение, докато грешките трябва да се внимават на системно ниво (само ако е възможно). След обработка на изключение, гарантирано ще се върнете към нормалния поток на програмата. Но дори и да е засечена грешка, програмистът може да не знае как да се справи с нея. За разлика от традиционното боравене с грешки, изключенията позволяват отделяне на код за обработка на грешки от обикновен код.