PDA

View Full Version : رد کردن خطا در try



mahyar501
جمعه 27 تیر 1399, 16:32 عصر
سلام. چطور می تونم وقتی خطایی در try رخ میده رو رد کنم و برنامه به بقیه کاراش برسه.
مثلا من یه foreach گرفتم و یکی یکی روی فایلهای سرچ شده کار انجام میدم. حالا یه خطایی رو یکی از فایلها رخ میده و در catch تو بانک خطا رو ذخیره میکنم. ولی نمی خوام foreach متوقف بشه و ادامه فایلها رو بررسی کنم:
foreach (...)
{
try{
کدهای مربوط به بررسی فایل
}
catch()
{
ثبت خطا در بانک
}

}

daniyaltjm
جمعه 27 تیر 1399, 17:04 عصر
سلام. چطور می تونم وقتی خطایی در try رخ میده رو رد کنم و برنامه به بقیه کاراش برسه.
مثلا من یه foreach گرفتم و یکی یکی روی فایلهای سرچ شده کار انجام میدم. حالا یه خطایی رو یکی از فایلها رخ میده و در catch تو بانک خطا رو ذخیره میکنم. ولی نمی خوام foreach متوقف بشه و ادامه فایلها رو بررسی کنم:
foreach (...)
{
try{
کدهای مربوط به بررسی فایل
}
catch()
{
ثبت خطا در بانک
}

}

سلام چرا حلقه foreach خارج از بدنه Try{} است؟!

mahyar501
جمعه 27 تیر 1399, 17:33 عصر
سلام چرا حلقه foreach خارج از بدنه Try{} است؟!
به صورت مثال گفتم. اون خودش داخل یه try دیگه هستش. من میخوام اگه فایلم خطا داشت بره سراغ فایل بعدی و برنامه متوقف نشه

مهدی کرامتی
جمعه 27 تیر 1399, 18:12 عصر
بر اساس منطق، وقتی خطایی داخل بلوک Try رخ بده، ادامه کدهای بعد از اون خطی که باعث خطا شده دیگه اجرا نمیشه و ادامه اجرا به بلوک Catch منتقل میشه. در کدی که شما نوشته اید با توجه به اینکه بلوک try..catch داخل حلقه foreach است ترکیب درست به نظر می رسد (اجرای حلقه اصولا باید ادامه پیدا کنه) مگر اینکه در عمل رفتار طور دیگری باشه (حلقه بعد از اولین خطا اجرا نشه). در مثال زیر:
List<int> numbers = new List<int>() {1,2,3,4,5,6};
foreach (int number in numbers)
{
try
{
if (number == 3)
{
throw new Exception($"Intentional Exception on {number}");
}
Console.WriteLine($"Current Number is {number}");
}
catch
{
Console.WriteLine($"Handling {number} caused an exception.");
}
}
این خروجی تولید میشه:

Current Number is 1
Current Number is 2
Handling 3 caused an exception.
Current Number is 4
Current Number is 5
Current Number is 6

daniyaltjm
جمعه 27 تیر 1399, 19:09 عصر
اول باید ببینی خطا چرا تولید میشه ... بعد باید با دستور if توی قسمت try بررسی کنی که اگر خطا رخ داد با استفاده از throw new یک خطا بصورت دستی تولید میکنیم و به قسمت catch ارسال میشه .

int[] a = new int[] { 1, 2, 3, 4, 5, 0, 7, 8, 9, 10 };
foreach (int num in a)
{
try
{
if (num == 0)
{
throw new DivideByZeroException();
}
else
{
Console.WriteLine(num / num);

}
}
catch (Exception error)
{
Console.WriteLine(error.Message);
}
}

1
1
1
1
1
Attempted to divide by zero.
1
1
1
1

همینطور که میبینی نه بار اعداد رو بهم تقسیم کرده و اونجایی هم که تقسیم بر 0 شده خطا به قسمت catch فرستاده شده ونمایش داده شده.

mahyar501
جمعه 27 تیر 1399, 21:12 عصر
اول باید ببینی خطا چرا تولید میشه ... بعد باید با دستور if توی قسمت try بررسی کنی که اگر خطا رخ داد با استفاده از throw new یک خطا بصورت دستی تولید میکنیم و به قسمت catch ارسال میشه .

int[] a = new int[] { 1, 2, 3, 4, 5, 0, 7, 8, 9, 10 };
foreach (int num in a)
{
try
{
if (num == 0)
{
throw new DivideByZeroException();
}
else
{
Console.WriteLine(num / num);

}
}
catch (Exception error)
{
Console.WriteLine(error.Message);
}
}

1
1
1
1
1
Attempted to divide by zero.
1
1
1
1

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

ShayanFiroozi
جمعه 27 تیر 1399, 21:33 عصر
سلام ،

دوست گرامی کد شما صحیح به نظر میاد ، اگر در اجرا اون کاریو که شما میخواین انجام نمیده احتمالا مشکل از جای دیگست ، اگر بخشی از کد رو به اشتراک بذارین میشه بررسی کرد.

mahyar501
جمعه 27 تیر 1399, 21:54 عصر
سلام ،

دوست گرامی کد شما صحیح به نظر میاد ، اگر در اجرا اون کاریو که شما میخواین انجام نمیده احتمالا مشکل از جای دیگست ، اگر بخشی از کد رو به اشتراک بذارین میشه بررسی کرد.


با سپاس از شما

محمد رضا فاتحی
جمعه 27 تیر 1399, 22:11 عصر
با اجازه اساتید
اگه برای دیکریپت فایل از تابع استفاده کرده باشین و اون تابع خطاهاش مدیریت نشده باشه از حلقه میپره بیرون

daniyaltjm
جمعه 27 تیر 1399, 22:45 عصر
با تشکر. من چند هزار فایل انکریپت شده دارم. و یکی یکی از بانک آدرسشونو میخونم و دیکریپت میکنم. حال تو این فایلها بعضیاشون بدلایلی دیکریپت نیمشن . خطا میده. میخوام اون رو رد کنه و به بقیه فایلها برسه.
در حالت کنونی، به خطا که میرسه دیگه جلو نمیره

خب اول کد رو بدون try , catch اجرا کن ببین برای چی خطا میده! مثلا تو کد بالا تقسیم بر 0 خطا ایجاد میکنه که با دستور if توی try اصلا اجازه ندادیم که تقسیم انجام بشه و یه خطا به سمت catch فرستاده شد حالا با توجه به الگوریتم دیکیریپتی که داره روی فایل ها اجرا میشه شاید چند پارامتر رو باید توی دستور if با هم && کنی که خطا نده یا چیزای دیگه ... باید کد های قسمت دیکریپت رو بزاری تا اساتید بررسی کنن.

barnamenevisjavan
شنبه 04 مرداد 1399, 09:43 صبح
سلام. چطور می تونم وقتی خطایی در try رخ میده رو رد کنم و برنامه به بقیه کاراش برسه.
مثلا من یه foreach گرفتم و یکی یکی روی فایلهای سرچ شده کار انجام میدم. حالا یه خطایی رو یکی از فایلها رخ میده و در catch تو بانک خطا رو ذخیره میکنم. ولی نمی خوام foreach متوقف بشه و ادامه فایلها رو بررسی کنم:
foreach (...)
{
try{
کدهای مربوط به بررسی فایل
}
catch()
{
ثبت خطا در بانک
}

}
داخل قسمت catch کافیه دستور continue رو بنویسی
اگر خطا ایجاد بشه رد میکنه میره سراغ بعدی