PDA

View Full Version : مشکل در catch کردن چند Exception



arash ghafori
پنج شنبه 12 اردیبهشت 1392, 19:59 عصر
با سلام.
من یک کلاس Validation دارم که شامل این 3 تابع هست :


public void Validate1(string name, int min, bool optional, Format format)
{
if (name == "")
{
throw new ArgumentNullException();
}
}

public void Validate2(string name, bool optional, Format format)
{
if (name == "")
{
throw new ArgumentNullException();
}
}

public void Validate3(string name, int min, bool optional, Format format)
{
if (name == "")
{
throw new ArgumentNullException();
}
}


حالا من مقدار 3 تا TextBox رو به ترتیب به این تابع ها میدم.

ولی هر سه تا با یه Catch کنترل میشه.


catch (ArgumentNullException)
{

MessageBox.Show("فیلد خالی است");
}


مشکل من اینه که میخام تک تک اینا جدا گونه Catch بشن و پیغام مربوط به خودشونو بدن !
مثلا اگه textbox1 خالی شد ، پیغام خودشو بده . و textbox2 خالی شد ، پیغام دیگه ای بده و....!
چیکار کنم ؟
ممنون !

کامبیز اسدزاده
پنج شنبه 12 اردیبهشت 1392, 20:23 عصر
خب شما در داخل هر یک از void ها تون یه try و یک catch استفاده کنید.

Mahmoud.Afrad
پنج شنبه 12 اردیبهشت 1392, 21:03 عصر
میتونی با یک متد هر سه تکست باکس رو چک کنی ، یک پارامتر دیگه برای متد در نظر بگیر. data برای متن تکست باکس و name برای پرتاب توسط exception. با همین name میتونی بفهمی کدوم تکست باکس خالی هست.

public void Validation(string data, string name, int min, bool optional)//, Format format)
{
if (data == "")
{
throw new ArgumentNullException(name);
}
}

arash ghafori
پنج شنبه 12 اردیبهشت 1392, 21:11 عصر
خب شما در داخل هر یک از void ها تون یه try و یک catch استفاده کنید.

نه.
من توی کلاس Validation اکسپشن رو throw میکنم و این دستور catch رو هم توی دکمه ی Add to DB نوشتم.

اگه من توی کلاس ، اکسپشنم رو throw کنم بعد توی همون کلاس Catchش کنم چطوری به کابر پیغاممو نمایش بدم ؟ مگه کلاس MessageBox داره ؟؟

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

arash ghafori
پنج شنبه 12 اردیبهشت 1392, 21:17 عصر
چرا سه متد یک شکل. میتونی با یک متد هر سه تکست باکس رو چک کنی ، یک پارامتر دیگه برای متد در نظر بگیر. data برای متن تکست باکس و name برای پرتاب توسط exception. با همین name میتونی بفهمی کدوم تکست باکس خالی هست.

public void Validation(string data, string name, int min, bool optional)//, Format format)
{
if (data == "")
{
throw new ArgumentNullException(name);
}
}


حرفتون کاملا درست و منطقیه !! ممنون .
اما یه سوال ؟
من الان Cachام رو کجا بنویسم؟
(Catchی که خودم توی اولین تاپیک گذاشتم ، توی دکمه ی Add هستش.
ممنون.

Mahmoud.Afrad
پنج شنبه 12 اردیبهشت 1392, 21:24 عصر
لایه ای کار میکنی؟ این چک کردن رو در چه لایه ای انجام میدی؟
اگر همه کلاست همینه که گذاشتی نیاز نیست کلاس ایجاد کنی. فوقش میتونی همین شرط رو جایی که نیاز هست به جای متد استفاده کنی. یا اینکه این متد رو در کلاس فرم بنویسی. اگر بگی کجا از این کلاس استفاده میکنی بهتره.

arash ghafori
پنج شنبه 12 اردیبهشت 1392, 21:39 عصر
لایه ای کار میکنی؟ این چک کردن رو در چه لایه ای انجام میدی؟
اگر همه کلاست همینه که گذاشتی نیاز نیست کلاس ایجاد کنی. فوقش میتونی همین شرط رو جایی که نیاز هست به جای متد استفاده کنی. یا اینکه این متد رو در کلاس فرم بنویسی. اگر بگی کجا از این کلاس استفاده میکنی بهتره.

در حال حاضر که طبق گفته ی شما برنامه رو تغییر ندادم ،این ی متد از کلاس Validation هست :



public void Charecter_Validate(string name, int min, bool optional, Format format)
{

if (optional == false)
{
if (name == "")
{
throw new ArgumentNullException();
}
else if (min < 3)
{
throw new ArgumentOutOfRangeException();
}
else if (textContainsUnacceptable(name, UnAcceptable))
{
throw new Exception();
}
}
}


و بعد این هم داخل دکمه ی Add to DB :

try
{
Validation a = new Validation();
a.Charecter_Validate(textBox1.Text, textBox1.TextLength, false, Format.Alphabet);

dbopration b = new dbopration();
b.connect();
b.insert("INSERT INTO Table1 (name,family,phone,codemeli,email,address)" + "VALUES (N'" + textBox1.Text + "',N'" + textBox2.Text + "',N'" + textBox3.Text + "',N'" + textBox4.Text + "',N'" + textBox5.Text + "',N'" + textBox6.Text + "')");
b.ShowDGV("SELECT * FROM Table1", dataGridView1, lblnumber);
b.Disconnect();
}
catch (ArgumentNullException)
{

MessageBox.Show("فیلد نام خالی است");
}
catch (ArgumentOutOfRangeException)
{
MessageBox.Show("تعداد حروف نام باید حداقل سه کارکتر باشد");
}
catch (Exception)
{
MessageBox.Show("در فیلد نام فقط رشته وارد کنید");
}


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

nasim2012
پنج شنبه 12 اردیبهشت 1392, 22:31 عصر
سلام
بهتره برنامه خودت را به این صورت بنویسی


public void Charecter_Validate(string name, int min, bool optional, string format)
{

if (optional == false)
{
if (name == "")
{
throw new Exception("فیلد نام خالی است");
}
if (min < 3)
{
throw new Exception("تعداد حروف نام باید حداقل سه کارکتر باشد");
}
if (textContainsUnacceptable(name, UnAcceptable))
{
throw new Exception("در فیلد نام فقط رشته وارد کنید");
}
}
}



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


catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

arash ghafori
پنج شنبه 12 اردیبهشت 1392, 22:42 عصر
سلام
بهتره برنامه خودت را به این صورت بنویسی


public void Charecter_Validate(string name, int min, bool optional, string format)
{

if (optional == false)
{
if (name == "")
{
throw new Exception("فیلد نام خالی است");
}
if (min < 3)
{
throw new Exception("تعداد حروف نام باید حداقل سه کارکتر باشد");
}
if (textContainsUnacceptable(name, UnAcceptable))
{
throw new Exception("در فیلد نام فقط رشته وارد کنید");
}
}
}



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


catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


ممنون از توجهتون.
اما این روش یه روش کلی هست . نه جزئی ! در ضمن من میخام پیغامی که من مینویسم نمایش بده ! نه Exception رو !

Mahmoud.Afrad
پنج شنبه 12 اردیبهشت 1392, 22:59 عصر
خب پیغام رو از طریق خود Exception منتقل کن. طبق مثال nasim2012 (http://barnamenevis.org/member.php?245219-nasim2012)



در غیر اینصورت باید از انواع مناسب Exception برای تفاوت استفاده کنی.

public void Character_Validation(string name, int min, bool optional, Format format)
{
if (optional == false)
{
if (name == "")
{
throw new ArgumentException();
}
else if (min < 3)
{
throw new ArgumentOutOfRangeException();
}
else if (textContainsUnacceptable(name, UnAcceptable))
{
throw new FormatException();
}
}
}

Catch هم که طبق همون انواع

catch (ArgumentException)
{
MessageBox.Show("فیلد نام خالی است");
}
catch (ArgumentOutOfRangeException)
{
MessageBox.Show("تعداد حروف نام باید حداقل سه کارکتر باشد");
}
catch (FormatException)
{
MessageBox.Show("در فیلد نام فقط رشته وارد کنید");
}

arash ghafori
پنج شنبه 12 اردیبهشت 1392, 23:36 عصر
اشتباه از من بود . nasim2012 درست میگفت .

ممنون از همتون.

linux
پنج شنبه 12 اردیبهشت 1392, 23:39 عصر
خوب موقع throw کردن یک مقدار بده مثلا throw new ArgumentNullException("فیلد نام خالی هست");
try
{
throw new ArgumentNullException("نام");
throw new Exception("فیلد نام خالی هست", new ArgumentNullException("Name"));

}

catch (ArgumentNullException ex1)
{
//if (ex1.ParamName == "نام")
// MessageBox.Show("فیلد نام خالی هست");
////or
MessageBox.Show(string.Format("فیلد {0} خالی هست", ex1.ParamName));


}
catch (Exception ex0)
{

MessageBox.Show(ex0.Message);
}