لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟
لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟
Last edited by am_merman01; 30-07-2007 at 01:21.
دوستان خوب سلام
من تازه میخوام با VB.net کارکنم و تازه شروع کردم از آقای H2 که این سایت رو معرفی کردن متشکرم از ارسال آموزشهای اين سايت هم بسيار سپاسگذارم
سلام
عضویتتان را در سایت تبریک میگم!نوشته شده توسط MMR_1344 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟
Last edited by am_merman01; 30-07-2007 at 01:23.
لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟
Last edited by am_merman01; 30-07-2007 at 01:18.
اقايون شرمنده سرم خيلي شلوغه.
امشب سعي ميكنم اين بحث رو تموم كنم. زياد عجله نكنيد
به دوستان شفیق پیشنهاد میکنم برخی جملاترا دیگه بکار نبرند و تا کاربر anvar.net همه مان را از تاپیکشان پرت نکرده بیرون دیگه تاپیک شان را بیشتر از این خراب نکنیم!!!!
با اجازه کاربر anvar.net ! قصد فضولی ندارم و اصلاً حوصله تایپ هم ندارم! ولی گفتم کمکی کرده باشم و صرفاً خارج از گود نگویم لنگش کن!
امیدوارم زودتر این پست را ببینید و مطلب دیگری آماده کنید! اگر شما هم در مورد Try نوشتید، خوب باز میگذارید، دو سری توضیح کامل در مورد try خواهیم داشت
در نتیجه با آجازه شما متن زیر را ببرای دستور Try آماده کردم، امیدوارم فایده داشته باشد و مطلبی هرچند کوچک ولی جدید به دانسته های عظیم دوستان بیافزاید.
---------------------------------------------------------------
دستور Try:
این دستور برای هندلینگ خطاها و انجام عمل مورد نظر در قبال خطایی خاص است، خطاها اگر هندلر نشوند موجب Runtime Error در برنامه نهایی میشوند.
ولی در کل همیشه بهتر است تا از بروز خطا جلوگیری شود، چون اتفاق افتادن خطا و هندلینگ آن کاری پر هزینه است و باعث کاهش سرعت و کارآیی برنامه نهایی میشود.
مثلاً وقتی که متغییر شی ای دارید که احتمال هم دارد خالی یا Null یا همان Nothing باشد،
یک راه این است که بدون توجه به مقدار ان از این متغییر استفاده کنیم و بگوییم اگر Nothing باشد فوقش خطایی به وجود می آید که آن را هم هندلر خواهیم کرد.
ولی این تفکر جالبی نیست!
بهنتر است در یک If در اول استفاده چک شود و اگر متغییر مورد نظر Nothing نبود دستورات مورد نظر را انجام دهیم.
در کل مجدداً تکرار میکنم که اغلب اوقات پیشگیری بهتر از درمان است.
سینتکس کلی:
دستورات شما بعد از Try قرار میگیرند، اگر خطایی رخ دهد مابقی دستورات دیگر اجرا نخواهد شد و پرشی خواهیم داشت به اولین بلوک Catch ای که با نوع خطای مورد نظر هماهنگی داشته باشد (توضیح بیشتر خواهم داد! فعلاً این را در نظر بگیرید که بلوک های متعدد Catch چیزی مثل ساختار Select Case عمل میکنند)یعنی به محض اینکه خطا با اولین بلوک مچ شود همان بلوک اجرا میشود و از کلیه بلوک های دیگر صرف نظر خواهد شد.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر خطای اتفاق افتاده با هیچ یک از بلوک های Catch مچ نشود، هندلینگ نخواهیم داشت و خطا به سلسله مراتب بالاتر در فراخانی ارسال میشود تا شاید در آنجا هندلر شود و الی آخر ... ( که من به آن میگویم بالا رفتن حبابی!) و اگر به منبع اصلی فراخانی برسد و هنوز هندلر نشده باشد موجب Runtime Error و توقف برنامه شما خواهد شد.
بلوک Finally اگر استفاده شود، تضمین میکند که در هر شرایطی بدون توجه به وقوع خطا - عدم وقوع خطا - اجرا شدن دستورات خروج سریع از قبیل Exit Sub و Exit Function و حتی دستور زیبا و جدید Return ، باز هم در هر شرایطی بلوک بعد از Finally اجرا خواهد شد.
از این بلوک میتوانید برای آزادسازی منابع-بستن ارتباطها-بستن فایلها و... استفاده کنید.
(البته نباید این بلوک را جایگزین دستور جدید و فوق العاده قوی Using کرد.)
------------------------------------------------------------
VB8 برخلاف VB6 به شدت شی گراست و همه چیز با قوانین OOP و پلی مورفیزم اداره میشوند، در این راستا برخلاف VB6 که خطاها ماهیتی عددی داشتند و هر خطا با عددی خاص تایین میشد، اینجا در VB8 خطا ها ماهیتی Class ای دارند و هر خطا خود یا کلاسس ماژول است!!!
هر کلاسس ماژول خطا در دات نت وراثتی است از کلاسس Sysytem.Exception و شما هم میتوانید برای خود خطاهاتی سفارشی درست کنید (وچه بهتر که وراثتی باشد از همان کلاسس) فعلاً کاری با چگونگی به وجود آوردن خطای سفارشی نداریم و بحث بر سر رفع آن است!
بلوکهای Catch هم بر اساس کلاس و وراثت کار میکنند!
شما در بلوک Catch یک متغییر به عنوان نماینده خود تعریف میکنید (معمولاً با نام ex)که پس از هندلینگ خطا، شی کلاس خطای مورد نظر درون این متغییر ریخته میشود و تحویل بلوک کد درون Catch شما خواهد شد، این متغییر که حالا حاوی شی خطاست دارای اطلاعات محل و موقعیت و پیغام خطا و... میباشد که اطلاعات دقیق تری به شما و کاربر شما در مورد خطای مورد نظر میدهد.
اینکه کدام بلوک Catch با نوع متغییری که تعریف کرده میتواند خطا را هندلر کند طبق قوانین وراثت است.
نمیخواهم در این پست آموزش مبانی OOP و Polymorphism را بدهم ولی با اجازه اساتید اشاره ای مختصر میکنم:
درخت کاج<-درخت<-گیاه<-جاندار<-ماده و جسم<-چیز و وجود!
هر "درخت کاجی" وراثتی است از "درخت" و هر "درخت" وراثتی است از "گیاه" و...
هر درخت کاجی حتماً یک درخت و یا یک گیاه است!
ولی هر "درختی"، "درخت کاج" نیست!
و هر "گیاهی" هم "درخت کاج" نیست!
همین مسئله در کلاسس های وراثتی هم صادق است!
اگر شما متغییری از نوع "درخت" تعریف کنید میتوانید تمام انواع درخت را در آن جای دهید و
اگر متغییری از نوع "گیاه" تعریف کنید میتوانید علاوه بر تمام درختها تمام گیاه های دیگر را هم در آن جای دهید.
(ریشه ای ترین کلاسس در محیط دات نت کلاسس Object است و هر چیزی را که در دات نت با آن سروکار دارید به صورت مستقیم و غیر مستقیم با چند پله فاصله وراثتی است از نوع Object و درست به همین علت است که وقتی متغییری از نوع Object دارید میتوانید در آن هرچیزی بریزید.)
مثلاً بلاک زیر:
Catch ex As System.IO.DirectoryNotFoundException
میتوانید خطای ناشی از وجود نداشتن پوشه را هندلر کند.
مثلا وقتی دستور پاک کردن فایلی را داده اید ولی اتصلاً پوشه مورد نظر وجود ندارد، خطای فوق اتفاق می افتد.
ولی کلاسس System.IO.DirectoryNotFoundException وراثتی است از کلاسس System.IO.IOException و این هم وراثتی است از کلاسس اصلی System.Exception
در نتیجه اگر خطای DirectoryNotFound اتفاق بیافتد، هر یک از سه بلوک زیر میتوانند خطای مورد نظر را هندلر کنند:
Catch ex As System.IO.DirectoryNotFoundException
Catch ex As System.IO.IOException
Catch ex As System.Exception
و هر سه نوع کد فوق در هندلینگ خطای DirectoryNotFound هیچ فرقی با هم نخواهند داشت و اگر هم هر سه Catch فوق را داشته باشیم اینکه کدامشان خطای DirectoryNotFound را هندلر خواهند کرد صرفا به این ربط دارد که کدام بلوک Catch بالاتر قرار دارد، یعنی مثل ساختار Select Case ، هر کدام که بالاتر باشد خطای DirectoryNotFound را هندلر میکند و بقیه بلوک ها اجرا نمیشود.
درکش راحت است!
یک "درخت کاج" همه اش، اصل وجودش، تمامش یک "درخت" است، به همان اندازه که
یک "درخت کاج" همه اش، اصل وجودش، تمامش یک "گیاه" است! سلسله مراتب وراثتی قابل تفکیک نیستند.
نتیجه اخلاقی آنکه اگر شما یک بلوک Catch ex As System.Exception در آخر بلاکها داشته باشید میتوانید تمام انواع خطاهای رخ داده در بلوک Try را هندلر کنید و نیز اگر یک بلوک فوق در اول بلوک های Catch داشته باشید همه خطا ها را هندلر میکند و مابقی بلوکهای Catch هیچ گاه اجرا نخواهند شد.
------------------------------------------------------------
نکات ریز باقی مانده!
هر ساختار Try باید حداقل یک بلوک Catch یا یک بلوک Finally داشته باشد و نیز طبیعی است که اگر بلوک Catch نداشته باشد هیچ خطایی را هندلر نمیکند.
تا اینجا همه مطالب برای زبان دوقولوی VB.Net یعنی C#.Net هم صادق بود، غیر از آن که بلوک ها در C#.Net با {} شروع و پایان می یابند ولی دستور When مختص VB.Net است و شما میتوانید مثل بلاک If Then با آن عمل کنید و علاوه بر نوع متغییر، شرطی برای ورود به Catch هم تایین کنید.
مطلب آخر آنکه که هندلینگ فقط در بعد از دستور Try وجود خواهد داشت! (خود بلوک Try) یعنی اگر کد شما در محل بلاکهای Catch یا بلاک Finally مجدداً باعث بروز خطا شود، این خودش خطایی جدید است و سلسله مراتب بالارفتن حبابی را طی خواهد کرد. ولی Try-Catch تودرتو به هر شکل مجاز است!
در جوار دات نت جون خوش بگذره!
ممنون _H2_ عزيز .
مثل هميشه کامل و دقيق بود.
اميدوارم شما و Avant عزيز به ارائه مطالب مفيدتون ادامه بدين
چند تا سوال داشتم
__________________________________________________ ________________________________
اولي اينه که کلا منظور از Handle و Handling چيه ؟ يه چيزايي مبهم ميدونم ولي واسم گنگه اگه يه کوچولو راهنماييم کني ممنون ميشم
__________________________________________________ ________________________________
و دوميش :
ميشه در مورد دستور Using توضيح بدين ؟(البته نباید این بلوک را جایگزین دستور جدید و فوق العاده قوی Using کرد.)
__________________________________________________ ________________________________
در حالاتي که خطا به ندرت پيش مياد مثلا کانکشن برقرار نشه ، بهتر نيست اين کار رو به پردازش استثناء واگذار کنيم ؟مثلاً وقتی که متغییر شی ای دارید که احتمال هم دارد خالی یا Null یا همان Nothing باشد،
یک راه این است که بدون توجه به مقدار ان از این متغییر استفاده کنیم و بگوییم اگر Nothing باشد فوقش خطایی به وجود می آید که آن را هم هندلر خواهیم کرد.
ولی این تفکر جالبی نیست!
بهنتر است در یک If در اول استفاده چک شود و اگر متغییر مورد نظر Nothing نبود دستورات مورد نظر را انجام دهیم.
__________________________________________________ ________________________________
يعني اگه يک تابع رو فراخواني کنم که در اون تابع خطا رخ بده و در بلوک Try موبوط به اون خطاي مورد نظرم با هيچيک از خطاهاي مورد نظر بلوکهاي Catch مطابقت نداشته باشه ، پردازش خطا به دنبال بلوک Catch اي که با خطا مطابقت داره در روال فراخوان ميگرده ؟ (اگه اينطوره که اين دات نت خيلي با کلاسه !) حالا فرض کن پردازش استثنايي تو روال فراخوان نداشته باشيم (در روال فراخوان و روالهاي بالاتر) اونوقت خطا در نظر گرفته نميشه ديگه نه ؟اگر خطای اتفاق افتاده با هیچ یک از بلوک های Catch مچ نشود، هندلینگ نخواهیم داشت و خطا به سلسله مراتب بالاتر در فراخانی ارسال میشود تا شاید در آنجا هندلر شود و الی آخر ... ( که من به آن میگویم بالا رفتن حبابی!) و اگر به منبع اصلی فراخانی برسد و هنوز هندلر نشده باشد موجب Runtime Error و توقف برنامه شما خواهد شد.
Last edited by bad_boy_2007; 29-07-2007 at 10:14.
هندلینگ را من به معنی عمومی "قلاب کردن-تور انداختن" استفاده کردم! یک دفعه شما خطا را هندلر میکنید و یک دفعه رویداد را، مثلاً زمانی که رویداد Click را هندلر میکنیدنوشته شده توسط bad_boy_2007 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حالا بزارید از دست این Try راحت بشیم! دل انگیز بابا!نوشته شده توسط bad_boy_2007 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ولی مثل دستور Dim است ولی پایانه استفاده از شی با End Using مشخص میشود و فقط هم برای اشیایی قابل استفاده است که رابط نابودسازی را پیاده سازی کرده باشند.
تشخیصش با شماست! اگر مثل باز کردن کانکشن به ندرت پیش می آید یا مثلاً فقط یک بار قرار است کد اجرا شود استفاده از Try بهتر استنوشته شده توسط bad_boy_2007 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ولی اگر احتمال وقوعش زیاد است و نیز کد مثلاً در یک حلقه بارها و بارها تکرار میبشود یا در وب توسط هزاران کاربر همزمان اجرا میشود بهتر است دقت بیشتری کنید.
دقیقاً !!! که گقتم، من نامش را گذاشته ام بالارفتن حبابی!نوشته شده توسط bad_boy_2007 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس چی! فکر کرده اید با چغندر قند طرف هستید!نوشته شده توسط bad_boy_2007 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اینن را هم گفتم! خطا به صورت سراسری اعلام میشود و موجب runtime Error و در نتیجه نمایش پنجره مربوطه و حتی در ورژن های گذشته موجب بسته شدن برنامه میشود.نوشته شده توسط bad_boy_2007 [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
تست کنید متوجه میشود
مثلاً در رویداد Form_Load بنویید
Dim i As Integer
i = 0
i = 0 \ i
و برنامه را کامپایل کنید و EXE اش را اجرا کنید، متوجه میشوید.
ممنون h2 جان بابت وقتي که براي پاسخ به سوالاتم گزاشتي
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)