دوستان برای نمایش متن خطاها به کاربر در چه مواقعی باید از throw new استفاده کنیم و در چه مواقعی از messagebox
دوستان برای نمایش متن خطاها به کاربر در چه مواقعی باید از throw new استفاده کنیم و در چه مواقعی از messagebox
بطور کلی پیشنهادم اینه که از MessageBox همیشه استفاده کنی چون حس بهتری به کاربر میده که اوضاع تحت کنترله
من نپرسیدم که از کدوم استفاده کنم
پرسیدم کاربرد throw new در مدیریت خطاها چی هستش
پرسیدی کی از کدوم استفاده کنی
خب این که پرسیدن نداره یک f1 روش بزنی msdn میگه که برای ساخت خطا است که یا در catch جهت تغییر خطا و پیامش و یا برای ایجاد خطای جدید در مواقعی که خطای استانداردی رخ نداده و شما میخواهید خطا تولید کنید مثلا قرار باشه کاربر عدد منفی وارد نکنه و کرده یک خطای جدید می سازید و اعلان میکنید
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);
}
}
ببخشید دوتا سوال برام پیش اومد:
۱-مگه در برنامه نویسی سه لایه مدیریت خطاها در لایه دوم صورت نمیگیرد؟چرا در لایه dal کدها را در بلاک try,cath قرار دادید؟یعنی در برنامه نویسی سه لایه باید برای مدیریت خطاها به همین شکل عمل کنیم؟
۱- اگر این تیکه کد را اجرا کنیم متن خطایی که به کاربر نمایش داده میشود "کد تکراریست" است یا متن انگلیسی؟
ببینید وارد لایه نشید. Throw ربطی به برنامه های چند لایه نداره. MessageBox از کلاس System.windows.Forms میاد و معلومه از این کنترل در کلاسهای فرم استفاده میشه و نه کلاس های معمولی. بنابراین وقتی شما دارید توی یک کلاسی کدنویسی میکنید اگز استثنایی رخ بده شما اون استثناء رو با استفاده از کلمه throw قرار میدید. در آخر هم در فرم ها و یا کنترلهاتون برای نمایش خطا با استفاده از try و catch و MessageBox اون خطا رو نمایش میدید.
میدونم ربطی به برنامه نویسی لایه ای نداره
سوال من در رابطه با مدیریت خطا در برنامه نویسی لایه ای بود
ایا برای مدیریت خطاها در برنامه نویسی سه لایه در هر سه لایه باید کدها را در بلاک try,cath قرار بدیم؟مثل کد بالا؟
و دوم این که در کد بالا چه خطایی به کاربر به نمایش در میاد ؟متن فارسی کد تکراریست یا متن انگلیسی
هرجایی که نیاز باشه
چرا تست نمیکنید؟ هر exception که رخ بده موقع نمایش دادن متن همون نمایش داده میشه.موقع رخ دادن استثناء زیر که Mahmoud.Afrad فرمودن:
throw new Exception("کد تکراریست", sqlEx.InnerException);
متن همین استثنا نمایش داده میشه چون exception قبلی که SqlException بود در قسمت catch اداره شده و استثناء جدیدی درش تعبیه شده و اون استثناء اولی دیگه در اون قسمت بدلیل وجود try و catch وجود نداره(بجز InnerException که در استثنای جدید قرار دادن).
کد بنده فقط یک مثال بود برای اینکه بفهمید هر جایی نباید استثناء رو new کنید بعضی جاها هم کافیه فقط پرتاب بشه. فقط جایی که نیاز باشه مثلا تغییر متن پیغام به فارسی.
در مورد فارسی یا انگلیسی بودن پیغام اگر ترتیب رو متوجه بشید میفهمید که استثنائی که ما new کردیم نمایش داده میشه(متن فارسی).