PDA

View Full Version : سوال: خطای منطقی بعد از عملکرد try catch



aminaltavista
دوشنبه 13 شهریور 1391, 23:02 عصر
سلام
مشکل من این جاست که بعد از این که یه خطا به وسیله try catch گرفته شد دوباره از مقادیر درست خطا میگره!

ببینید مثلا من یکی از فیلدهای جدولم integer هست اما اگر که کاربر به جای عدد یک رشته رو وارد کند مسلما خطا میدهد و خطا هم به وسیله try catch گرفته میشود . خب تا این جا درست حال اگه یه متغیر رشته ای رو وارد کنیم باز هم همون خطایی که از قبل گرفته بود رو نشون میده! من میگم احتمالا فضایی باید آزاد بشه تا این خطا در مورد داده های درست دیگه تکرار نشه. اما نمیدونم از چه کلاسی استفاده کنم . قبلا از dispose استفاده میکردم اما الان بی تاثیر هست . برنامه ای هم که توش گیر کردم دیتابیس رو باز میکنه و عضو sqlcommand هم تغییرات رو اعمال و مجددا دیتابیس بسته میشه.

امیدوارم که منظورم رو درک کرده باشید:متفکر:

m0hammad_01
سه شنبه 14 شهریور 1391, 00:17 صبح
سلام
مطمئنی؟ در عمل این اتفاق نباید بیافته.شما به کدی که مینویسی تو Try , Catch دقت کن.راه حل تو کد شماس.
در ضمن Try Catch یه قسمت دیگه به نام Finaly هم داره.ببین بهت کمکی میکنه یا نه.
اگه تونستی کد بزار

aminaltavista
سه شنبه 14 شهریور 1391, 08:36 صبح
اگه تونستی کد بزار

نه! نشد

ببینید از جایی که خطا دارم براتون کدش رو میزارم و توضیح میدم:


try
{
Conn.Open();
Comm.ExecuteNonQuery();
Conn.Close();
}
catch (SqlException Err)
{
if (Err.Message.Contains("PRIMARY KEY "))
{
lblSucess.Visible = false;
lblWait.Visible = false;
lblStatus.Visible = true;
status.BackColor = Color.IndianRed;
lblStatus.Text = ". این کاربر یک بار در سیستم ثبت شده است و امکان ثبت مجدد آن وجود ندارد";
return;
}
}
btnNew_Click(sender, e);
LoadData();
this.lblStatus.Visible = false;
this.lblWait.Visible = false;
this.status.BackColor = Color.Green;
this.lblSucess.Visible = true;
this.lblSucess.BringToFront();

return;
}


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

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

Mahmoud Zaad
سه شنبه 14 شهریور 1391, 09:12 صبح
سلام
شما هر بار که ثبت رو انجام میدی باید مقادیر پیش فرضی رو که در نظر داری به متغیرهایی که تعریف کردی، تخصیص بدی.(خیلی جمله وحشتناکی شد!). منظورم اینه که شما بعد از اینکه ثبت رو انجام دادی باید لیبل رو خالی کنی که دفعه بعد اگه ثبت به درستی و بدون خطا انجام شد، همونطور خالی بمونه. حالا نمیدونم اینکارو کردی یا نه؟ توی کدهات که مشخص نیست. البته می تونی کد خالی کردن لیبل رو قبل از همه کدهات بنویسی یعنی قبل از کلمه try.

aminaltavista
سه شنبه 14 شهریور 1391, 09:23 صبح
بحث یه خورده تخصصی شد

با بررسی هایی که کردم فهمیدم متد کاملا درست کار میکنه! عیب کار از تایمر است و بدون تایمر که تست کردم درست کار کرد.البته یه خورده تخصصی هست و من بیشتر از این به شما زحمت نمیدم. خودم پیگیرش میشم و احتمالا تو یه پست نحوه استفاده رو آموزش میدم.

از این که یاری کردید ممنونم.

Mahmoud Zaad
سه شنبه 14 شهریور 1391, 09:31 صبح
بحث یه خورده تخصصی شد


خیلی! تخصصی شد. به قول معروف" اصن یه وضعی!"

aminaltavista
سه شنبه 14 شهریور 1391, 09:53 صبح
خیلی! تخصصی شد. به قول معروف" اصن یه وضعی!"

هاهاهاهاهاها:قهقهه:

یه جورایی ! آخه میدونی این error اصلا کاری به try catch نداره . اگه یادتون باشه گفته بودم که بعد از فشردن دکمه ثبت پیغامی مبنی بر لطفا صبر کنید .. نشون داده میشه. خب من برا انجام این کار از تایمر استفاده کردم و اون جا متد رو صدا زدم اما متد به تنهایی کارش رو درست انجام میده و گیر کار تایمر هست که لوپ میشه ونمیدونم چرا خطا رو هم لوپ میکنه . به همین علت گفتم تخصصی هست و اگه ادمه بدادم با موضوع پست ارتباطی نداشت و در نتیجه برادران مراقب به علت فاقد مفهوم تاپیک رو حذف میکردند.