PDA

View Full Version : سوال: بازگشت به ناحیه ای که استثنا ایجاد شده



PANAMA
شنبه 31 اردیبهشت 1390, 19:58 عصر
سلام دوستان.
این اولین پست من هست.

من در برخی مواقع نیاز دارم که برنامه به خطی که خطا رخ داده برگرده و یا اینکه برنامه بعد از خطی که استثنا پرتاب شده ادامه یابد.

هنوز نتونستم که راهکاری اصولی برای اینکار پیدا کنم.
در مورد برگشت به خطی که خطا ایجاد شده، از یک حلقه استفاده می کنم.
به عنوان نمونه من در قطعه کد زیر، فضای دردسترس یک درایو رو بدست میارم. و در صورت بروز هر گونه خطا، اجرای دستورات به همان نقطه بر میگردد.
البته این فقط یک مثال هست.

DriveInfo d = new DriveInfo("DriveName");

for (; ; )
{
try
{
MessageBox.Show(d.AvailableFreeSpace.ToString());
}
catch
{
if (MessageBox.Show("Drive is not ready\nTry agian?",
"Error", MessageBoxButtons.YesNo) == DialogResult.Yes)

continue;
}
break;
}


در این روش برنامه بدون هیچ مشکلی، کار میکنه. ولی اگر تعداد خط هایی که امکان ایجاد استثنا در آنها وجود داره، بیشتر از یک بشه، این روش کارایی خودشو از دست میده.

آیا در سی شارپ برای این مسئله راهکاری درنظر گرفته شده است؟
ممنون میشم راهنمایی بفرمایید.

mehdi.mousavi
شنبه 31 اردیبهشت 1390, 20:26 عصر
سلام دوستان. این اولین پست من هست.

سلام.
به برنامه نویس خوش آمدید.


در مورد برگشت به خطی که خطا ایجاد شده، از یک حلقه استفاده می کنم. به عنوان نمونه من در قطعه کد زیر، فضای دردسترس یک درایو رو بدست میارم. و در صورت بروز هر گونه خطا، اجرای دستورات به همان نقطه بر میگردد. البته این فقط یک مثال هست.

چه چیزی باعث میشه تا کد شما در دفعات بعدی اجرا با Exception روبرو نشه؟ میخوام بگم وقتی یکبار به Exception خورد، دیگه به چه دلیل دوباره باید همون روند رو اجرا کرد تا دوباره همون نتیجه بدست بیاد؟ (البته بسته به شرایط ممکنه نتیجه متفاوت باشه، که در این صورت، باید از Exception ای با Type مناسب استفاده کرد، نه اینکه کلیه Exception ها رو گرفت). ضمن اینکه catch(Exception) بدی هایی داره (در .NET نسخه های ماقبل 4.0) که قبلا در پست هام به اون اشاره کرده ام. گذشته از این، این Loop ممکنه تا ابد اجرا بشه، چون ممکنه اون خطا به دلائل متفاوت، همواره تکرار بشه... با توجه به مطالبی که گفتم، یکی از روش های پیاده سازی این نیاز، در پست دوم این URL (http://stackoverflow.com/questions/1563191/c-cleanest-way-to-write-retry-logic) ذکر شده. اما مطمئن بشید که قبل از استفاده از این پیاده سازی، حتما توضیحات Eric Lippert (http://stackoverflow.com/users/88656/eric-lippert) رو در همون پست مطالعه کنید.



آیا در سی شارپ برای این مسئله راهکاری درنظر گرفته شده است؟ ممنون میشم راهنمایی بفرمایید.

خیر. این مساله قبلا در Microsoft بارها مطرح شده و پیاده سازی اون در مایکروسافت به رای گذاشته شده، اما از اونجاییکه استفاده از این سناریو، فقط در موارد خاصی صورت میگیره، مایکروسافت هیچ construct ای برای این مساله در اختیار برنامه نویسان قرار نداده و همواره Workaround هایی شبیه آنچه در پست فوق بهش اشاره کردم، در چنین سناریوهایی توصیه شده.

موفق باشید.