Thursday, April 26, 2007

Exception Handling or Exception Silencing?

بحث سینا و مهرداد در کامنت‌های این پست سینا من را یاد این نوشته Bruce Eckel درباره Exception Handling در Java انداخت، به خصوص این بخشش:

The theory is that if the compiler forces the programmer to either handle the exception or pass it on in an exception specification, then the programmer's attention will always be brought back to the possibility of errors and they will thus properly take care of them.

I think the problem is that this is an untested assumption we're making as language designers that falls into the field of psychology. My theory is that when someone is trying to do something and you are constantly prodding them with annoyances, they will use the quickest device available to make those annoyances go away so they can get their thing done, perhaps assuming they'll go back and take out the device later. I discovered I had done this in the first edition of Thinking in Java:

try{
...
} catch (SomeKindOfException e) {}

And then more or less forgot it until the rewrite. How many people thought this was a good example and followed it? I began seeing the same kind of code, and realized people were stubbing out exceptions and then they were disappearing. The overhead of checked exceptions was having the opposite effect of what was intended, something that can happen when you experiment (and I now believe that checked exception were an experiment based on what someone thought was a good idea, and which I believed was a good idea until recently).

4 comments:

sobhan said...

سلام
شما رو دعوت کردم به شرکت در بازی آرزوها
لطفا بیايد وبلاگم رو بخونيد و بازی رو ادامه بديد...

سینا said...

سلام پاسپارتو جان. مثل همیشه جالب بود. منم همین کارو می‌کنم. چون خیلی وقتا نمی دونم باهاشون چی کار کنم، و مابقی وقتا حوصله شونو ندارم. همین جوری بهش می‌دیم بره.

sharpedia said...

چه جالب (آخه يه چيزي كشف كردم كه هيجان زده ام كرده!!!...)

هميشه برام سوال بود كه چرا سي.شارپ مثل جاوا برنامه نويس رو مجبور نميكنه كه بصورت صريح يا استثنا
رو مديريت كنه، و يا در امضاي تابع اون رو قيد كنه. ( واين رو نقطه ضعف سي.شارپ ميدونستم)
نميدونم برداشتم تا چه حد درسته، ولي بنظرم ميرسه كه اين اقدام سي.شارپ تا حدودي باعث ميشه اون
قضيه "خفه كردن" استثناءها كمتر اتفاق بيافته. (حتي اگر دليلي غير از اين هم داشته باشه).
بارها شده كه گاهي اوقات نميدونستم با يك استثاناء احتمالي چكار كنم؟ و ترجيح دادم كه هيچكاري نكنم و
اجازه بدم كه استثنا بيافته دست محيط اجرا. اينطوري سناريوهاي مختلفي كه بخاطر اون استثاء رخ ميداد
رو ميتونستم بتدريج شناسايي كنم (كه درواقع تاثير استثناء رو در لايه هاي بالاتر مشخص ميكرد)
و درنهايت تصميم بگيرم كه سر اون استثناء چه بلايي بايد بگيرم.

پاسپارتو said...

سبحان عزیز
از لطفت ممنون، کاش می شد با هم حرف بزنیم

سینا جان
من هم حد اکثر کاری که می کنم این هست که یک دستورچاپ در کنسول بگذارم که یک چرت و پرتی بنویسد!

مهرداد عزیز
به نظر من برنامه نویس ها خیلی از استثناها را فراموش می کنند، حالا در هر زبانی که باشد ، فقط در جاوا اذیت می شوند در سی شارپ نه! نمی دانم چطور می شود هوای این استثناها را داشت، اما دنیای نرم افزار با وجود این استثناها چندان فاجعه بار نیست، یا لااقل فاجعه هایش به خاطر استثناها نیست! شاید طراحان جاوا زیادی مته به خشخاش گذاشته باشند. نکته ای هم که در مورد سناریوهای بعد از استثنااشاره کردی جالب است، شاید حتی بشود از آن برای تست سیستم استفاده کرد مثلا بفهمیم کدام بخشها روی هم اثر دارند، شاید رابطه ای از نظر ما دور مانده باشد، گرچه نمی دانم این حرفم چقدر می تواند مؤثر باشد