PDA

View Full Version : کاربرد throw new در مدیریت خطاها



negar.rafie
یک شنبه 14 مهر 1392, 14:18 عصر
دوستان برای نمایش متن خطاها به کاربر در چه مواقعی باید از throw new استفاده کنیم و در چه مواقعی از messagebox

fjm11100
یک شنبه 14 مهر 1392, 14:38 عصر
بطور کلی پیشنهادم اینه که از MessageBox همیشه استفاده کنی چون حس بهتری به کاربر میده که اوضاع تحت کنترله

negar.rafie
یک شنبه 14 مهر 1392, 15:53 عصر
من نپرسیدم که از کدوم استفاده کنم
پرسیدم کاربرد throw new در مدیریت خطاها چی هستش

fjm11100
یک شنبه 14 مهر 1392, 20:19 عصر
پرسیدی کی از کدوم استفاده کنی:متعجب:
خب این که پرسیدن نداره یک f1 روش بزنی msdn میگه که برای ساخت خطا است که یا در catch جهت تغییر خطا و پیامش و یا برای ایجاد خطای جدید در مواقعی که خطای استانداردی رخ نداده و شما میخواهید خطا تولید کنید مثلا قرار باشه کاربر عدد منفی وارد نکنه و کرده یک خطای جدید می سازید و اعلان میکنید

Mahmoud.Afrad
یک شنبه 14 مهر 1392, 20:39 عصر
throw یعنی پرتاب. فرض کن در لایه dal یک استثناء رخ میده اما برای بررسی اون باید اونو به لایه دوم پاس بدی به خاطر همین فقط throw میکنی و در لایه دوم اونو catch میکنی و بررسیش میکنی و مثلا ازش log میگیری.
در لایه dal داریم:

public void DoSomethingOnDbInDal()
{
try
{
// فرض کنید در عمل درج ، کلیداصلی تکراریست
}
catch (SqlException)
{
throw;
}
}

حالا برای نمایش پیغام به کاربر باید استثنائی رو به لایه سوم ارسال کنی تا با مسیج باکس به کاربر پیغام نمایش داده بشه حالا میتونی برحسب نوع خطا ، استثناء با پیغام مناسب رو new و پرتاب کنی و در لایه سوم اونو میگیری و نمایش میدی.
در لایه دوم(منطق) داریم:

public void DoSomethingInbusinessLayer()
{
try
{
dal d = new dal();
d.DoSomethingOnDbInDal();
}
catch (SqlException sqlEx)
{
// logging sqlEx
// after logging
if (sqlEx.Number == 2627)
{
throw new Exception("کد تکراریست", sqlEx.InnerException);
}
}
}

در لایه سوم داریم:

private void DoSomethingInPresentationLayer()
{
try
{
pl p = new pl();
p.DoSomethingInbusinessLayer();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

negar.rafie
دوشنبه 15 مهر 1392, 08:34 صبح
ببخشید دوتا سوال برام پیش اومد:
۱-مگه در برنامه نویسی سه لایه مدیریت خطاها در لایه دوم صورت نمیگیرد؟چرا در لایه dal کدها را در بلاک try,cath قرار دادید؟یعنی در برنامه نویسی سه لایه باید برای مدیریت خطاها به همین شکل عمل کنیم؟
۱- اگر این تیکه کد را اجرا کنیم متن خطایی که به کاربر نمایش داده میشود "کد تکراریست" است یا متن انگلیسی؟

pedram.11
دوشنبه 15 مهر 1392, 09:03 صبح
ببینید وارد لایه نشید. Throw ربطی به برنامه های چند لایه نداره. MessageBox از کلاس System.windows.Forms میاد و معلومه از این کنترل در کلاسهای فرم استفاده میشه و نه کلاس های معمولی. بنابراین وقتی شما دارید توی یک کلاسی کدنویسی میکنید اگز استثنایی رخ بده شما اون استثناء رو با استفاده از کلمه throw قرار میدید. در آخر هم در فرم ها و یا کنترلهاتون برای نمایش خطا با استفاده از try و catch و MessageBox اون خطا رو نمایش میدید.

negar.rafie
دوشنبه 15 مهر 1392, 09:18 صبح
میدونم ربطی به برنامه نویسی لایه ای نداره
سوال من در رابطه با مدیریت خطا در برنامه نویسی لایه ای بود
ایا برای مدیریت خطاها در برنامه نویسی سه لایه در هر سه لایه باید کدها را در بلاک try,cath قرار بدیم؟مثل کد بالا؟
و دوم این که در کد بالا چه خطایی به کاربر به نمایش در میاد ؟متن فارسی کد تکراریست یا متن انگلیسی

pedram.11
دوشنبه 15 مهر 1392, 09:43 صبح
ایا برای مدیریت خطاها در برنامه نویسی سه لایه در هر سه لایه باید کدها را در بلاک try,cath قرار بدیم؟مثل کد بالا؟
هرجایی که نیاز باشه


دوم این که در کد بالا چه خطایی به کاربر به نمایش در میاد ؟متن فارسی کد تکراریست یا متن انگلیسی
چرا تست نمیکنید؟ هر exception که رخ بده موقع نمایش دادن متن همون نمایش داده میشه.موقع رخ دادن استثناء زیر که Mahmoud.Afrad فرمودن:
throw new Exception("کد تکراریست", sqlEx.InnerException);
متن همین استثنا نمایش داده میشه چون exception قبلی که SqlException بود در قسمت catch اداره شده و استثناء جدیدی درش تعبیه شده و اون استثناء اولی دیگه در اون قسمت بدلیل وجود try و catch وجود نداره(بجز InnerException که در استثنای جدید قرار دادن).

Mahmoud.Afrad
دوشنبه 15 مهر 1392, 10:36 صبح
کد بنده فقط یک مثال بود برای اینکه بفهمید هر جایی نباید استثناء رو new کنید بعضی جاها هم کافیه فقط پرتاب بشه. فقط جایی که نیاز باشه مثلا تغییر متن پیغام به فارسی.

در مورد فارسی یا انگلیسی بودن پیغام اگر ترتیب رو متوجه بشید میفهمید که استثنائی که ما new کردیم نمایش داده میشه(متن فارسی).