PDA

View Full Version : مشكل در دستور On Error Goto



A_1397
شنبه 23 مهر 1390, 14:10 عصر
دوستان من تويكي از ماژول هاي برنامم دو بار از دستور On Error Goto استفاده كردم. ولي فقط اولي اجرا ميشه و و وقتي ارروري رخ مي ده و بايد بره سراغ دستور دومي، نميره. مشكل كجاست؟ (مثلا در زير اگر تصويري در مسير نباشه پيغام ميده ولي اگه توي load گريد ارروري پيش بياد نميره سراغ خط StartError:متفکر:)

On Error GoTo AddErr
pic = "D:\picture.jpg"
Form2.Image.Picture = LoadPicture(pic)
AddErr:
Unload Me
("!تصوير مورد نظر يافت نشد")MsgBox

On Error GoTo StartError
mn = "Select * From Table"
rs.Open mn, strcon, adOpenStatic, adLockOptimistic
Form2.Grid1.DataSource = rs1
StartError:
MsgBox Err.Description

محسن واژدی
شنبه 23 مهر 1390, 14:26 عصر
سلام
کد را بررسی کنید:

Private Sub Command1_Click()
On Error GoTo AddErr
pic = "D:\picture.jpg"
Form2.Image.Picture = LoadPicture(pic)

On Error GoTo StartError
mn = "Select * From Table"
rs.Open mn, strcon, adOpenStatic, adLockOptimistic
Form2.Grid1.DataSource = rs1

Exit Sub
AddErr:
MsgBox ("!ÊÕæíÑ ãæÑÏ äÙÑ íÇÝÊ äÔÏ")
Unload Me
Exit Sub
StartError:
MsgBox Err.Description
End Sub


موفق باشید

xxxxx_xxxxx
شنبه 23 مهر 1390, 16:54 عصر
سلام،
تو اینجور مواقع که نیاز به دو یا چند On Error دارید بهتر هست یک بار On Error رو در ابتدای sub بنویسید و در انتهای sub، با بررسی شماره خطاها (Err.Number)، خطاها رو هندل کنید.

مرتضی تقدمی
شنبه 23 مهر 1390, 22:01 عصر
سلام
خب چرا از try catch استفاده نمی کنید؟!

MohammadGh2011
شنبه 23 مهر 1390, 22:06 عصر
سلام
خب چرا از try catch استفاده نمی کنید؟!
سلام عليکم
ببخشيد آقاي تقدمي اينجا تالار VB ميباشد نه #C
فکر کنم منظور آقاي تقدمي کد زير ميباشد.

On Error Resume Next


موفق باشيد

مرتضی تقدمی
شنبه 23 مهر 1390, 22:19 عصر
نه من خیال کردم این try catch رو vb6 داره. اما مثل اینکه نداره! آخه vb.net داره. :خجالت:
مثل اینکه چاره ای جز استفاده از همین on error go to نیست!

A_1397
یک شنبه 24 مهر 1390, 13:29 عصر
سلام
کد را بررسی کنید:

Private Sub Command1_Click()
On Error GoTo AddErr
pic = "D:\picture.jpg"
Form2.Image.Picture = LoadPicture(pic)

On Error GoTo StartError
mn = "Select * From Table"
rs.Open mn, strcon, adOpenStatic, adLockOptimistic
Form2.Grid1.DataSource = rs1

Exit Sub
AddErr:
MsgBox ("!ÊÕæíÑ ãæÑÏ äÙÑ íÇÝÊ äÔÏ")
Unload Me
Exit Sub
StartError:
MsgBox Err.Description
End Sub


موفق باشید
آقاي واژدي عزيز اين دستورات جواب نميده چون با اين كد اگر در لود تصوير دچار خطا بشه ميره سراغ AddErr و چون توي اين دستور شما exit sub گذاشتين كه كلا از sub خارج ميشه و ديگه به كد مربوط به گريد نميره و گريد خالي نمايش داده ميشه. اگرهم exit sub را برداريم بعد از دادن پيغام تصوير ميره و خط StartError‌روهم اجرا ميكنه و باز كلا از sub خارج ميشه بدون اجراي گريد! :افسرده:

A_1397
یک شنبه 24 مهر 1390, 13:31 عصر
سلام عليکم
ببخشيد آقاي تقدمي اينجا تالار VB ميباشد نه #C
فکر کنم منظور آقاي تقدمي کد زير ميباشد.

On Error Resume Next


موفق باشيد

حلا دوست عزيز اين كد On Error Resume Next چيكار ميكنه؟ كاراييش مثل همون On Error Goto هستش؟

محسن واژدی
یک شنبه 24 مهر 1390, 14:32 عصر
آقاي واژدي عزيز اين دستورات جواب نميده چون با اين كد اگر در لود تصوير دچار خطا بشه ميره سراغ AddErr و چون توي اين دستور شما exit sub گذاشتين كه كلا از sub خارج ميشه و ديگه به كد مربوط به گريد نميره و گريد خالي نمايش داده ميشه. اگرهم exit sub را برداريم بعد از دادن پيغام تصوير ميره و خط StartError‌روهم اجرا ميكنه و باز كلا از sub خارج ميشه بدون اجراي گريد!

بله، در بیشتر موارد پس از نمایش خطا برنامه بایستی از روال خارج میشود، بمنظور اینکه پس از نمایش خطا، آدرس تصویر اصلاح شود بایستی پس از دستور خطا دستورالعمل های بیشتری را وارد کنید،



حلا دوست عزيز اين كد On Error Resume Next چيكار ميكنه؟ كاراييش مثل همون On Error Goto هستش؟

این دستور برخلاف OnErrorGoTo تمامی دستگیره های خطا را خاموش میکند، و برنامه پس از رسیدن به کد خطا انرا نادیده گرفته و به خط بعدی میرود

موفق باشید

A_1397
یک شنبه 24 مهر 1390, 17:20 عصر
سلام،
تو اینجور مواقع که نیاز به دو یا چند On Error دارید بهتر هست یک بار On Error رو در ابتدای sub بنویسید و در انتهای sub، با بررسی شماره خطاها (Err.Number)، خطاها رو هندل کنید.
آقاي مدير نشد كه!!! :گریه: اومدم طبق فرمايش شما دستورات روبه زير تغيير دادم:

Private Sub Command1_Click()
On Error GoTo AddErr
pic = "D:\picture.jpg"
Form2.Image.Picture = LoadPicture(pic)

:L1
mn = "Select * From Table"
rs.Open mn, strcon, adOpenStatic, adLockOptimistic
Form2.Grid1.DataSource = rs1
Exit Sub

AddErr:
If Err.Number = 76 Then
("!تصوير مورد نظر يافت نشد")MsgBox Else
GoTo L1
else
If Err.Number = 360 Then
MsgBox Err.Description
End If
End if

ولي بازهم اررور اول رو جواب ميده ولي اگه دستورات گريد هم اررو داشته باشه ديگه نميره سراغ AddErr! انگار اصلا توهرsub يه بار دستور on Error Goto اجرا ميشه!!

xxxxx_xxxxx
یک شنبه 24 مهر 1390, 18:07 عصر
سلام،
برای جاهایی که میشه با دستور if حالت های خطا رو پیدا کرد، بهتره از On Error استفاده نکنیم. به نظر من هیچ لزومی نداره برای LoadPicture از On Error استفاده کنید. می تونید با تابع PathFileExists (http://barnamenevis.org/tags.php?tag=PathFileExists) وجود فایل رو بررسی کنید.

ASedJavad
دوشنبه 25 مهر 1390, 10:37 صبح
سلام
معمولا تو وی بی وقتی دستور on erro رو میدی، تا وقتی دستور resume رو ندی، دستورت ناقصه و در نتیجه چنین مشکلی پیش میاد
یعنی این طرز دستور نوشتن شما مثل اینه که شما یه if رو بدون end if نوشتی
ولی در اینجا اگرچه برنامت اجرا میشه (یعنی در اصل vb دستور end sub‌رو به عنوان پایان دهنده on error در نظر میگیره) ولی اون چیزی که میخوای از آب در نمیاد
دستور resume بعد از اینکه کارهای مورد نظر رو پس از برخورد با خطا انجام دادی، نوشته میشه و سه نوعه:
1-resume: که این دستور برنامه رو به همون خطی که توش خطا رخ داده برمیگردونه
مثلا فرض کن تو همین مثال شما در خطای اول میفهمی که آدرس تصویر اشتباهه.
حالا میای آدرس رو درست میکنی و دوباره میخوای برنامه همون خطی رو اجرا کنه که توش خطا رخ داده. در اینجا از resume استفاده میکنی.
2- resume next: این دستور اجرای برنامه رو از خط بعد از خطی که خطا توش رخ دادهپی میگیره.
3- resume line: که بجای line لیبل خط مورد نظرتو میذاری که این دستور برنامت رو از خطی که بهش میده پی میگیره.

مثلا شما میتونی برنامت رو اینجوری اصلاح کنی:



On Error GoTo AddErr
pic = "D:\picture.jpg"
Form2.Image.Picture = LoadPicture(pic)
L1:
On Error GoTo startErr
mn = "Select * From Table"
rs.Open mn, strcon, adOpenStatic, adLockOptimistic
Form2.Grid1.DataSource = rs1
Exit Sub
AddErr:
MsgBox "تصویر موردنظر یافت نشد!"
Resume L1
startErr:
MsgBox Err.Description

A_1397
دوشنبه 25 مهر 1390, 16:18 عصر
سلام
معمولا تو وی بی وقتی دستور on erro رو میدی، تا وقتی دستور resume رو ندی، دستورت ناقصه و در نتیجه چنین مشکلی پیش میاد
یعنی این طرز دستور نوشتن شما مثل اینه که شما یه if رو بدون end if نوشتی
ولی در اینجا اگرچه برنامت اجرا میشه (یعنی در اصل vb دستور end sub‌رو به عنوان پایان دهنده on error در نظر میگیره) ولی اون چیزی که میخوای از آب در نمیاد
دستور resume بعد از اینکه کارهای مورد نظر رو پس از برخورد با خطا انجام دادی، نوشته میشه و سه نوعه:
1-resume: که این دستور برنامه رو به همون خطی که توش خطا رخ داده برمیگردونه
مثلا فرض کن تو همین مثال شما در خطای اول میفهمی که آدرس تصویر اشتباهه.
حالا میای آدرس رو درست میکنی و دوباره میخوای برنامه همون خطی رو اجرا کنه که توش خطا رخ داده. در اینجا از resume استفاده میکنی.
2- resume next: این دستور اجرای برنامه رو از خط بعد از خطی که خطا توش رخ دادهپی میگیره.
3- resume line: که بجای line لیبل خط مورد نظرتو میذاری که این دستور برنامت رو از خطی که بهش میده پی میگیره.

مثلا شما میتونی برنامت رو اینجوری اصلاح کنی:



On Error GoTo AddErr
pic = "D:\picture.jpg"
Form2.Image.Picture = LoadPicture(pic)
L1:
On Error GoTo startErr
mn = "Select * From Table"
rs.Open mn, strcon, adOpenStatic, adLockOptimistic
Form2.Grid1.DataSource = rs1
Exit Sub
AddErr:
MsgBox "تصویر موردنظر یافت نشد!"
Resume L1
startErr:
MsgBox Err.Description


آقا بينهايت متشكرم :تشویق: