PDA

View Full Version : مبتدی: خروج از تابع جاری



ali_habibi1384
جمعه 18 دی 1388, 08:42 صبح
من قبلا VB6 کار می کردم و حالا با C#2008 کارام رو دارم انجام میدم. مشکل اینجاست که من برای هندل کردن ارورهام از ساختار زیر استفاده می کنم:
if is error1 then er=description
if is error2 then er=description
if is error3 then er=description
.
.
.
if er<> nul then show error messeg and exit function
یعنی اگه خطایی رو شناسایی کنم با دادن پیام مناسب برنامه خطوط بعدی رو نباید انجام بده قبلا برای اینکار در vb6 از کلمه exit sub یا exit function استفاده می کردم اما توی C#2008 از چه کلمه ای باید استفاده کرد؟ آیا راه حلی داره ؟
توی فروم چندتا تاپیک دیدم اما بجای حل کردن مشکل آقای آرژنگ گفته بود این کارو نکنید (بجای حل مسئله صورت مسئله رو پاک کرده بود) حالا راه حل چیست؟

FastCode
جمعه 18 دی 1388, 09:19 صبح
try
{
x=1/0;
}
catch(Exception ex)
{
}
من هم با انجام ندادن این کار موافقم.

mir555
جمعه 18 دی 1388, 09:19 صبح
توی سی شارپ از try Catch استفاده کنی به این ترتیب

try
}
کدی که احتمال بروز خطا داره
{
catch(Exception ex)
{
ex.message تو این متغییرپیام خطا قرار می گیره
{

اگه خطا به وجود بیاد میره کد داخل catch اجرا می کنه

اَرژنگ
جمعه 18 دی 1388, 10:23 صبح
من قبلا VB6 کار می کردم و حالا با C#‎‎‎2008 کارام رو دارم انجام میدم. مشکل اینجاست که من برای هندل کردن ارورهام از ساختار زیر استفاده می کنم:
if is error1 then er=description
if is error2 then er=description
if is error3 then er=description
.
.
.
if er<> nul then show error messeg and exit function
یعنی اگه خطایی رو شناسایی کنم با دادن پیام مناسب برنامه خطوط بعدی رو نباید انجام بده قبلا برای اینکار در vb6 از کلمه exit sub یا exit function استفاده می کردم اما توی C#‎‎‎2008 از چه کلمه ای باید استفاده کرد؟ آیا راه حلی داره ؟
توی فروم چندتا تاپیک دیدم اما بجای حل کردن مشکل آقای آرژنگ گفته بود این کارو نکنید (بجای حل مسئله صورت مسئله رو پاک کرده بود) حالا راه حل چیست؟


۱.یک لینک به این چیزهایی که گفتید من صورت مسعله را عوض کردم بفرستید.
۲.من یک نفرم، تا جایی که تونستم جواب دادن را پیگری کردم ولی بعد از بارها گفتن اینکه روشها اشتباست و به امید اینکه یک روزی سطح این فروم بره بالا که من هم برم پی کارم ، خسته شدم و به جایه اینکه وقتم را تلف کنم اینکه یک چیزی اشکال دارد را میگم، کسی که علاقه داشته باشد گوگل هست میره پی گیری میکنه ، زمان ما نه گوگل بود نه اینترنت ، کسی هم نبود که حتی اشکال بگیره دیگر چه برسه به اینکه روش درست را در اختیارم بزارد.
اگر زمان داشته باشم تا جایی که بتونم پی گیری میکنم.
۳.قبل از پریدن به کد نویسی اول مطالعه:
http://msdn.microsoft.com/en-us/library/s6da8809(VS.71).aspx

ali_habibi1384
جمعه 18 دی 1388, 15:51 عصر
متاسفانه کسی نتونست جواب سوالم رو بده و بازهم با دادن پستهای بی مورد وقت تلف کردن. خوشبختانه خودم جواب سوالم رو پیدا کردم واسه اینکه دیگران هم بدونن می نویسم برای خروج از کلمه کلیدی return استفاده کنید.

ali_habibi1384
جمعه 18 دی 1388, 15:54 عصر
توی سی شارپ از try Catch استفاده کنی به این ترتیب

try
}
کدی که احتمال بروز خطا داره
{
catch(Exception ex)
{
ex.message تو این متغییرپیام خطا قرار می گیره
{


اگه خطا به وجود بیاد میره کد داخل catch اجرا می کنه



ممنون از شما ولی شما منظور سوال منو درک نکردید . منظور من خطاهای منطقی بود نه Sysntax مثلا چک کردن فرمت تاریخ یا یه شماره حساب 10 رقمی . روشی رو که شما گفتید در صورت بروز خطای Syntax خطا رو هندل می کنه. متشکرم

اَرژنگ
جمعه 18 دی 1388, 17:18 عصر
متاسفانه کسی نتونست جواب سوالم رو بده و بازهم با دادن پستهای بی مورد وقت تلف کردن. خوشبختانه خودم جواب سوالم رو پیدا کردم واسه اینکه دیگران هم بدونن می نویسم برای خروج از کلمه کلیدی return استفاده کنید.

اینکه چه جوری به این جواب رسیدید را درک نمیکم ولی همینکه کارتان راه افتاد و زحمت کشیدید که جواب را به ما هم بگید متشکریم، شاید دفعه دیگر که کسی سوالی شبیه این سوال را پرسید بیشتر بتونیم درک کنیم که به دنبال چه جوابی است.

موفق باشید

mir555
جمعه 18 دی 1388, 17:26 عصر
میشه بگی چجوری با return خطا رو هندل کردییی؟؟؟

linux
جمعه 18 دی 1388, 18:31 عصر
میشه بگی چجوری با return خطا رو هندل کردییی؟؟؟
خطا را هندل نکرده این دوستمون لهجه دارد منظورش این بود که اگر یک حالتی اتفاق افتاد بعد از انجام کار از تابع خارج بشود و بقیه دستورات نادیده گرفته بشود.

ali_habibi1384
جمعه 18 دی 1388, 19:56 عصر
میشه بگی چجوری با return خطا رو هندل کردییی؟؟؟
البته . این کلاسی هست که واسه این کار تولید کردم :


class IsValidDate
{
public string IsOk (string s)
{
if (s.Length != 10) return " ";
if (s[4].ToString() != "/" || s[7].ToString() != "/") return " ####/##/## !";
int yr, mn, dy;
try
{
yr = Convert.ToInt32(s.Substring(0, 4));
mn = Convert.ToInt32(s.Substring(5, 2));
dy = Convert.ToInt32(s.Substring(8, 2));
}
catch
{
return " ####/##/## !";
}
if (yr > 1400 || yr < 1388) return " . ";
if (mn > 12 || mn < 1) return " . ";
if (dy > 31 || dy < 1) return " . ";
if (dy == 31 && mn > 6) return " 31 . ";
return "";
}

}

اینهم طریقه هندلش :


if (e.ColumnIndex == 0)
{
string s = dataGridView2.CurrentRow.Cells[0].Value.ToString();
if (s == "") s = "0";
IsValidDate k = new IsValidDate();
string rt = k.IsOk(s);
if (rt != "")
{
MessageBox.Show(rt, " ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}

اَرژنگ
جمعه 18 دی 1388, 20:16 عصر
البته . این کلاسی هست که واسه این کار تولید کردم :


class IsValidDate
{
public string IsOk (string s)
{
if (s.Length != 10) return " ";
if (s[4].ToString() != "/" || s[7].ToString() != "/") return " ####/##/## !";
int yr, mn, dy;
try
{
yr = Convert.ToInt32(s.Substring(0, 4));
mn = Convert.ToInt32(s.Substring(5, 2));
dy = Convert.ToInt32(s.Substring(8, 2));
}
catch
{
return " ####/##/## !";
}
if (yr > 1400 || yr < 1388) return " . ";
if (mn > 12 || mn < 1) return " . ";
if (dy > 31 || dy < 1) return " . ";
if (dy == 31 && mn > 6) return " 31 . ";
return "";
}

}

اینهم طریقه هندلش :


if (e.ColumnIndex == 0)
{
string s = dataGridView2.CurrentRow.Cells[0].Value.ToString();
if (s == "") s = "0";
IsValidDate k = new IsValidDate();
string rt = k.IsOk(s);
if (rt != "")
{
MessageBox.Show(rt, " ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}


این کد از روش اشتباه برایه اینکه رشته داده تاریخ درست است و یا نه استفاده میکند.

از لحاض برنامه نویسی متدهایی که با Is شروع میشند برایه جواب دادن به یک حالت منطقی هستند و نوع بازگشتیشان از نوع bool هست، استفاده از رشته و تفتیش اینکه شرطی را بر آورده میکند درست نیست.

این کد ۳۱ اسفند را به عنوان یک تاریخ درست قبول میکند (تا جایی که یادم میاد اسفند ۳۱ روز نبود).

روش آسانتر این بود که در مورد اینکه یک رشته تاریخ درستی است (در تقویم شمسی ) سوال میکردید (در همین تالار بارها جواب داده شده و از این همه کد کمتر و درست).

اگر از همان اول هدفتان را یکمی توضیح میدادید به جایه اینکه در نتیجه به یک کد اشتباه برسید جواب درست را در خدمتان میزاشتیم، بیشتر از همه خودتان وقت خودتان را هدر دادید.

مشکل اصلیتان ندانستن سی‌شارپ نیست، روشهایه اشتباه وی‌بی را به سی‌شارپ پیاده کردن است.

موفق باشید

mir555
جمعه 18 دی 1388, 20:22 عصر
try
{
yr = Convert.ToInt32(s.Substring(0, 4));
mn = Convert.ToInt32(s.Substring(5, 2));
dy = Convert.ToInt32(s.Substring(8, 2));
}
catch
{
return" ####/##/## !";
}


این فکر کنم try catch باشه

اَرژنگ
جمعه 18 دی 1388, 20:29 عصر
try
{
yr = Convert.ToInt32(s.Substring(0, 4));
mn = Convert.ToInt32(s.Substring(5, 2));
dy = Convert.ToInt32(s.Substring(8, 2));
}
catch
{
return" ####/##/## !";
}


این فکر کنم try catch باشه

بودن و یا نبودنش مهم نیست، از return try catch به این شکل وسط مرحلهاستفاده نمیشه.

ali_habibi1384
شنبه 19 دی 1388, 06:14 صبح
نه این کد ماههای 6 به بعد رو چک می کنه که 31 روز نباشند :

if (dy == 31 && mn > 6)
نا گفته نماند من وقتی کپی پیست کردم توی فروم نوشته های فارسی تبدیل به . شد و بعضی از کدها راست چین چپ چینش بهم خورد . به هر حال اینو فرستادم.