Метате ли ексепшъни?
25 отговора
0 прегледа
Метате ли ексепшъни?
Напоследък преглеждам една codebase ~5000 реда, разделена на 3 (три, да) файла и ми е чудно как това изобщо стартира, еми то реално ако не е raise if е raise unless, повечето от места, които С++ хората биха нарекли конструктор :) Има четри сравнително топ-левел хандлера, понеже, през FFI границата изцепшън е сегфолт, иначе немаше да ги има - еми извинявам се много - права си буквално квото искам и това се дъни адекватно!
Това ексепшъните са чудо - метайте рано, метайте повече
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Това ексепшъните са чудо - метайте рано, метайте повече
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Re: Метате ли ексепшъни?
Никога няма да 'метна' изцепка! Освен в случаите когато деля на 0, или пипам по срамни места.
Re: Метате ли ексепшъни?
много рядко, по-рядко от гото. никога не ползвам ексепшън за защита на мой код, само на чужд. а тия дето ползват throw все едно е алтернативна форма на ретурн, направо трябва да се редят по пет на греда.
NE SUTOR ULTRA CREPIDAM
NE SUTOR ULTRA CREPIDAM
Re: Метате ли ексепшъни?
public Date getTomorrow() {
try {
Thread.sleep(1000 * 60 * 60 * 24);
return new Date();
} catch (Exception ex) {
return getTomorrow();
}
}
try {
Thread.sleep(1000 * 60 * 60 * 24);
return new Date();
} catch (Exception ex) {
return getTomorrow();
}
}
Re: Метате ли ексепшъни?
Бе ти се ебаваш, но това е най-големата неразбиранка - като хендълваш ексепшън логването е едно на ръка, после - или ретрайваш, или райзваш нагоре или си кхъм, нали...
Не може да имаш хандлер, който гълта без _сериозно_ обяснение.
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Не може да имаш хандлер, който гълта без _сериозно_ обяснение.
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Re: Метате ли ексепшъни?
Ползването на ексепшъни като контрол флоу трябва да се криминализира.
Но - за нормално програмисване е манна небесна - топ левел хандлери + ако езика поддържа функцията да връща квото ти е кеф, ако не - чейнваме.
Заблудата около ексепшъните е подобна на заблудата около AddRef/Release - хората ти дават шанс - това е колбек - боли ги кура иначе :)
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Но - за нормално програмисване е манна небесна - топ левел хандлери + ако езика поддържа функцията да връща квото ти е кеф, ако не - чейнваме.
Заблудата около ексепшъните е подобна на заблудата около AddRef/Release - хората ти дават шанс - това е колбек - боли ги кура иначе :)
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Re: Метате ли ексепшъни?
По-забавното е когато хем фъргат ексепшънье, хем връщат статус кодове. Намират се и такива идиоти...
Re: Метате ли ексепшъни?
Все пак, нека уточним как ажеба се пише грамотно ексепшън хандлер (за съжаление нашите Java приятели са вън на студа, понеже има __ИДИОТСКО__ правило в езика, което изисква, ако нещо мета - да хендълваш задълже, което тотално войдва смисъла на ексепшъните на първо място)
Та:
try/begin/whatever блок
пази и само пази
единствения и само него
успешно инициализиран ресурс
непосредствено преди него
В rescue, catch или както там се казва или ретрайваш или меташ нагоре или си топ левел или не е твоя работа да се буташ да хендълваш на първо място
Като бонус, ако езика поддържа лесен код-като-параметър е забавно това да го имплементираш веднъж и после да си го преизползваш с кеф, което допълнително дава конфиденция, че нещата са ок
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Та:
try/begin/whatever блок
пази и само пази
единствения и само него
успешно инициализиран ресурс
непосредствено преди него
В rescue, catch или както там се казва или ретрайваш или меташ нагоре или си топ левел или не е твоя работа да се буташ да хендълваш на първо място
Като бонус, ако езика поддържа лесен код-като-параметър е забавно това да го имплементираш веднъж и после да си го преизползваш с кеф, което допълнително дава конфиденция, че нещата са ок
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Re: Метате ли ексепшъни?
Аз съм на противоположното мнение: не ползвам изцепшъни в C++ (ако зависи от мен), именно защото throw списъците на функциите нищо не вършат и не форсват или да хендълнеш изцешъна, или да го сложиш в списъка. Така нема форсирана дисциплина, а от там и целата употреба става на принципа "умен съм бил - сетил съм се".
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: Метате ли ексепшъни?
Напротив, би трябвало да освобождаваш ресурсите в finally блока.
Дава ли езика/библиотеката възможност за прихващане на изключения, би трябвало да се използват интензивно. Алтернативата да се проверява върнатата стойност след всеки съмнителен ред, е повече от досадна и увелчава бр. на редовете безсмислен код.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
Дава ли езика/библиотеката възможност за прихващане на изключения, би трябвало да се използват интензивно. Алтернативата да се проверява върнатата стойност след всеки съмнителен ред, е повече от досадна и увелчава бр. на редовете безсмислен код.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
Re: Метате ли ексепшъни?
Ако трябва да се въведе още една класификация към кода/програмата, то много важна би била тази - каква е връзката м/у кода и усера? И за да бъда по ясен давам пример: едни са изискванията към кода на една игра в която усера клика с мишката и евентуалните грешки, които могат да възникнат са от изчерпани ресурси на ОС, но много по-вероятно от колегата на съседното бюро, който не е допуснал, че ф-ята не прихваща грешно подадени стойности и допуска деление на нула. Съвсем други са изискванията към една счетоводна програма например, в която има 10-15 полета всяко едно от които трябва да се провери, дали въведените стойности отговарят на условията, дали въведената стойност в поле х, отговаря на въведеното в поле у, тъй като са взаимнозависими и т.н. Практиката показва, че ако има теоретична възможност усера да сбърка, то той със сигурност ще го направи.
Какво отношение има това към изключенията? На усера трябва да се гледа като на още един елемент от веригата, който генерира най-много условия за изключения.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
Какво отношение има това към изключенията? На усера трябва да се гледа като на още един елемент от веригата, който генерира най-много условия за изключения.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
Re: Метате ли ексепшъни?
Обувките са предназначени да са ни УДОБНИ, не ние на тех.
Именно топ левел хандлери + безмилостно райзване като не ни отърва, конституира една чудесна продуктивна среда, където си правиме каквото искаме, евентуално угаждайки на _реален_ проблем :)
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Именно топ левел хандлери + безмилостно райзване като не ни отърва, конституира една чудесна продуктивна среда, където си правиме каквото искаме, евентуално угаждайки на _реален_ проблем :)
def toggle(what) send("#{what}=", !send("#{what}?")); self end
Re: Метате ли ексепшъни?
... м-дааа... отивам да запаля една цигара.
General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
Re: Метате ли ексепшъни?
Ексепшъните са добро нещо, но за съжаление трудно се намират добри практики при тяхното използване.
Понеже последните 10 год изключително махам Уеба Джава с база отзад съм набелязал някои според мен добри практики. Които са аматьорски, ама вършат работа. ;)
Като получаваш някакви параметри винаги ги проверявай и меткай класиката за Джава IllegalArgumentException.
Като зареждаш някакъв обект винаги меткай NotFoundException - ако го няма, а не да връщаш NULL. Оти тогава ще изгърми с NullPointerException и на друго място и трябва да човъркаш кода докато намериш, че нещо не е заредено от базата, примерно.
Понеже в базата има Foreign Key (reference integrity) горните NotFoundException са голяма досада, щото знаеш, че няма как да се случат. В тоя случай ги хващам и ги врапвам със супер якия RuntimeException, като целта е да се премахне от сигнатурата, че метка NotFoundException, щото тоя метод реално не би трябвало да метка такъв ексепшън.
Има и още такива, ама сега нямам време.
Най-важното логвай всичко каквото имаш под ръка. Сесии, параметри, енвиронмент, каквото има всичко се логва във файл - задължително. Щото много често лога ти е единствения приятел, който може да ги каже какво е станало. ;)
Понеже последните 10 год изключително махам Уеба Джава с база отзад съм набелязал някои според мен добри практики. Които са аматьорски, ама вършат работа. ;)
Като получаваш някакви параметри винаги ги проверявай и меткай класиката за Джава IllegalArgumentException.
Като зареждаш някакъв обект винаги меткай NotFoundException - ако го няма, а не да връщаш NULL. Оти тогава ще изгърми с NullPointerException и на друго място и трябва да човъркаш кода докато намериш, че нещо не е заредено от базата, примерно.
Понеже в базата има Foreign Key (reference integrity) горните NotFoundException са голяма досада, щото знаеш, че няма как да се случат. В тоя случай ги хващам и ги врапвам със супер якия RuntimeException, като целта е да се премахне от сигнатурата, че метка NotFoundException, щото тоя метод реално не би трябвало да метка такъв ексепшън.
Има и още такива, ама сега нямам време.
Най-важното логвай всичко каквото имаш под ръка. Сесии, параметри, енвиронмент, каквото има всичко се логва във файл - задължително. Щото много често лога ти е единствения приятел, който може да ги каже какво е станало. ;)