PDA

View Full Version : سوال: Try - Catch در VB6



milad-fa
جمعه 14 آبان 1389, 09:30 صبح
سلام دوستان،
آیا کسی میدونه که چطور میشه در VB6 مثل #C از قابلیت Try-Cache بهره برد؟!
آیا vb6 این قابلیت رو داره؟اگه نداره میشه با کد نویسی ایجادش کرد؟
آیا vb.net این قابلیت رو داره؟!
یک سوال دیگه هم دارم که شاید مربوط به این تالار نباشه:
طریقه کارش به چه صورت هست،یعنی اگه تغییراتی در بانک ایجاد بشه و بعد مشکلی پیش بیاد آیا اثر اون تغییرات از بین میره؟!
ممنون.
با تشکر.

returnx
جمعه 14 آبان 1389, 10:00 صبح
آیا کسی میدونه که چطور میشه در VB6 مثل C#‎‎‎ از قابلیت Try-Cache بهره برد؟!

در VB شما باید با دستور on error این کا رو انجام بدید مثلا:

On Error Goto labelname

آیا vb6 این قابلیت رو داره؟اگه نداره میشه با کد نویسی ایجادش کرد؟
با کد نویسی باید این قابلیت رو ایجاد کنید.

آیا vb.net این قابلیت رو داره؟!
بله vb.net این قابلیت رو داره

طریقه کارش به چه صورت هست،یعنی اگه تغییراتی در بانک ایجاد بشه و بعد مشکلی پیش بیاد آیا اثر اون تغییرات از بین میره؟!
نمیدونم:لبخند:
البته این رو هم اظافه کنم :
نحوه استفاده Try...Catch در vb.net :

Try
کدی که شک دارید امکان ایجاد خطا داشته باشه
Catch
کدی که در صورت خطا اجرا میشود
Finally
کدی که می خواهید بعد از دستورات Catch اجرا شود (اختیاریست)
End Try
البته اکثر برنامه نویس های VB (مثل خودم) سعی میکنند خودشون رو به زحمت نندازند و از کد دوست داشتنی زیر استفاده کنند:

On Error Resume Next

milad-fa
جمعه 14 آبان 1389, 12:56 عصر
یعنی try-cache به این صورت نیست که اگر دستورات try کامل انجام نشد بصورت خودکار تمامی اثرات دستورات اجرا شده رو از بین ببره؟!در این صورت چه فرقی با on error داره؟!

returnx
جمعه 14 آبان 1389, 13:09 عصر
یعنی try-cache به این صورت نیست که اگر دستورات try کامل انجام نشد بصورت خودکار تمامی اثرات دستورات اجرا شده رو از بین ببره؟!در این صورت چه فرقی با on error داره؟!
اگه میخواین در صورتی که دستورات try کامل انجام نشد پس اعمال نشه میتونید از Try-Catch تو در تو استفاده کنید به این صورت:

Try
کدی که شک دارید امکان ایجاد خطا داشته باشه
Catch
کدی که در صورت خطا اجرا میشود
Try
کدی که باعث شود تغییرات اعمال نشود(به عبارتی الگوریتم به عقب برگرده)
Catch
هر کدی که نیز باشه رو مینویسیم
End Try
End Try
البته شاید این راه اصولی نباشه...
من که تفاوتی در Try-catch و on error ندیدیم ولی دلیل ایجاد این ساختار شاید منسوخ شدن دستور GOTO در برنامه نویسی مدرن باشه!

milad-fa
جمعه 14 آبان 1389, 13:20 عصر
من تصور میکردم دستوراتی که در try اجرا میشه اگر به هر دلیلی به پایان نرسه تمامی دستوراتی که اجرا شدن بصورت خودکار و بدون هیچ کدنویسی اثراتشون از بین میره(به عقب برمیگرده) و در قسمت cache میشه مثلاً یه msgbox گذاشت که 'تراکنش مورد نظر با موفقیت صورت نگرفت'.
یعنی اینطور نیست و برای به عقب برگشتن تو net. هم باید کد نوشت؟!:ناراحت:

returnx
جمعه 14 آبان 1389, 13:58 عصر
من تصور میکردم دستوراتی که در try اجرا میشه اگر به هر دلیلی به پایان نرسه تمامی دستوراتی که اجرا شدن بصورت خودکار و بدون هیچ کدنویسی اثراتشون از بین میره(به عقب برمیگرده) و در قسمت cache میشه مثلاً یه msgbox گذاشت که 'تراکنش مورد نظر با موفقیت صورت نگرفت'.
یعنی اینطور نیست و برای به عقب برگشتن تو net. هم باید کد نوشت؟!:ناراحت:
شاید هم اینجوری که شما گفتید باشه دقیقا مطمئن نیستم حالا شما اگه میخوای تست کن تا هم شما و هم من مطمئن(فکر کنم غلط املایی دارم:لبخند:) شیم...

milad-fa
جمعه 14 آبان 1389, 14:28 عصر
شاید هم اینجوری که شما گفتید باشه دقیقا مطمئن نیستم حالا شما اگه میخوای تست کن تا هم شما و هم من مطمئن(فکر کنم غلط املایی دارم:لبخند:) شیم...
من net. رو سیستمم فعلاً نصب نیست.
اگر برات مقدوره یه تست کن.
دوستان دیگه اگر اطلاعاتی در این زمینه دارن لطفاً راهنمایی کنید.

returnx
جمعه 14 آبان 1389, 14:36 عصر
من net. رو سیستمم فعلاً نصب نیست.
اگر برات مقدوره یه تست کن.
دوستان دیگه اگر اطلاعاتی در این زمینه دارن لطفاً راهنمایی کنید.
:لبخند: .net تو win7 نصب کردم الان هم تو Xp هستم ، برای همین به شما گفتم ولی مشکلی نیست یه چند لحظه وایسین بهتون خبر میدم...
البته من هم از دوستانی که اطلاعاتی دارند ممنون میشم به ما کمک کنند.
خوب من تست کردم حدس شما درست بود نگاه کنید من از این کد ها استفاده کردم :


Public Class Form1
Dim a As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
a = a + 100000000000
Catch ex As Exception
MsgBox(a)
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
a = 900000000
End Sub
End Class

جوابی که به من داد همون :900000000 بود.
(در ضمن اررور درست کردن هم واقعا کار سختیه:قهقهه:

milad-fa
جمعه 14 آبان 1389, 15:19 عصر
نه دوست عزیز شما باید دستور زیر رو تست کنید:

PublicClass Form1
Dim a AsInteger
PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
a=a+1
a = a + 100000000000
Catch ex As Exception
MsgBox(a)
EndTry
EndSub
PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
a = 900000000
EndSub
EndClass

returnx
جمعه 14 آبان 1389, 16:59 عصر
خوب پس حالا حدس من درست از آب در اومد:بامزه: جواب شد :
900000001
ولی خوب با این وجود چه تفاوتی با On Error داره؟

xxxxx_xxxxx
جمعه 14 آبان 1389, 18:54 عصر
سلام،
عنوان تاپیک اصلاح شد. (Catch صحیح هست!)
اینکه در تالار VB6 دنبال کاربرد Try-Catch باشید یه خورده عجیب هست!


ولی خوب با این وجود چه تفاوتی با On Error داره؟ On Error یک ساختار ساده و قدیمی و منسوخ شده برای هندل کردن خطاهای احتمالی برنامه هست. Try-Catch قدرتمند تر عمل میکنه و انعطاف پذیری بیشتری نسبت به On Error داره. به علاوه اینکه از ساختار مناسبی برخوردار هست. بر خلاف On Error Goto که ساختار منسوخ شده محسوب میشه.

توی On Error ما خطا رو با توجه شمارش هندل میکنیم (Err.Number) اما تو NET. ، بر حسب نوع Exception رخ داده، خطا رو شناسایی می کنیم.

چون Try-Catch ساختار بلاکی داره خوانایی بیشتری داره و استفاده ازش هم راحتر هست. علاوه بر بلاک های Try و Catch یک بلاک Finally هم هست که باعث میشه دستورات داخل بلاک Finally در هر شرایطی اجرا بشن. (چه خطایی رخ بده و چه خطایی رخ نده)

برای اطلاعات بیشتر در مورد Try-Catch در بخش NET. جستجو کنید.