PDA

View Full Version : چگونگی پیدا کردن error در fox



mahdiyeh
شنبه 18 تیر 1384, 14:13 عصر
چه جوری میشه برنامه ای رو که به زبان فاکس نوشته شده باشه رو عیب یابی کرد " از چه گزینه هایی باید استفاده کنیم"

javad_hosseiny
شنبه 18 تیر 1384, 21:15 عصر
در تمامی زبانها به چه صورت است؟
از طریق تریس کردن (اجرای خط به خط برنامه) و تعیین محل اشکال و خطا
دستورات set step on
و پارامترهای error() , message() , lineno() , ...
این کار را انجام می دهد

mahdiyeh
یک شنبه 19 تیر 1384, 08:54 صبح
تریس کردن چه جوریه

rezaTavak
یک شنبه 19 تیر 1384, 20:53 عصر
سلام

من یه راه دیه پیشنهاد میکنم. برنامه را با tools و debugger باز کن و خط به خط اشکال زدایی کن. البته در ویژوال فاکس پرو.

mahdiyeh
دوشنبه 20 تیر 1384, 14:26 عصر
من فقط من ظورم فاکس نه ویژوال

someCoder
دوشنبه 20 تیر 1384, 16:13 عصر
من 5 سالی هست که با فاکس پرو کار نکردم اما تا جایی که یادمه باید اینو مینوشتی توی command prompt:
set trace on

اگر نشد بگو برم بگردم

javad_hosseiny
دوشنبه 20 تیر 1384, 17:10 عصر
چه در محیط ویژوال فاکس پرو و چه در محیط فاکس تحت داس فرقی نمی کند از هر کجا به بعد که می خواهی تریس (خطایابی) کنی (یعنی هر محدوده ای که احتمال خطا می دهی) دستور set step on را آنجا تایپ کنید
******
ولی در کل پیشنهاد می کنم با استفاده از دستور
on error do ?
نام برنامه کنترل خطا خود را فراخوانی کرده و توسط توابعی مانند:
lineno() خط ایجاد خطا (خط فراخوانی شده توسط برنامه دیباگر)
message() پیام خطا ایجاد شده
error() کد خطا (که به طبع توسط شما دارای جدولی از کدها باید باشد و توسط آن خطا برنامه دلخواه شما فعال شود (من دارای یه شبه برنامه ای جهت کنترل خطاها هستم درصورت تمایل برایتان ایمیل کنم)
و یا توسط توابع sys() کنترل مقدار حافظه را نیز بدست آورید
******
برنامه دیباگر مربوط به فاکس فعال شده و امکان اجرای خط به خط برنامه را به شما می دهد و در پنجره های دیگر این قسمت قابلیت دیدن محتوی متغیرها و یا پارامترهای ...
در ضمن دستوری به نام set trace on نداریم بلکه پنجره ایی به نام trace داریم

someCoder
دوشنبه 20 تیر 1384, 18:35 عصر
آره! نداریم. گفتم که آخرین بار 5 سال پیش دیده بودمش! فکر کنم set step on رو باهش قاطی کردم!

mahdiyeh
سه شنبه 21 تیر 1384, 06:02 صبح
اگه میشه برام میل کنید

javad_hosseiny
سه شنبه 21 تیر 1384, 09:02 صبح
دو فایل ضمیمه موجود است (البته فرقی باهم ندارند فقط در یکی پیامها بصورت متن برای محیط داس بوده و در دیگری برای محیط ویندوز)
نحوه فراخوانی آن نیز بصورت
ON ERROR DO TRAP WITH ERROR(), PROGRAM(), LINENO()
می باشد
پارامترهای ارسالی کد خطا ، نام برنامه تولیدکننده خطا، خط ایجاد خطا می باشد
برنامه در ابتدا فایلی به نام error.msg به عنوان بایگانی خطاهایی ایجاد شده درست می کند (که در صورت وجود به انتهای آن اضافه می کند)
و کلیه خطاها با تاریخ و ساعت ایجاد آن در این فایل ذخیره می شود
و همچنین پیغامی متناسب با کد خطا برای کاربر نمایش داده می شود
(از آنجایی که این قسمت از یک برنامه کامل است من متغیر روز جاری (tar) را در داخل خود برنامه فراخوانی کرده ام tar=m2sh(date()) شما می توانید این متغیر را در داخل برنامه اصلی اتان و خارج از این برنامه بخوانید تا هر بار اجرا نشود)

mehran_337
دوشنبه 27 فروردین 1386, 13:16 عصر
بهترین حال در زمانیکه خطاهای زیر می ده در کنترل خطا چیه؟؟؟؟
1 - file is in use
2 - بدون هیچ پیغامی پنجره ای باز می شه که حاوی جداول بانک اطلاعاتی برنامه هست .
این حالت بیشتر زمانی برام پیش اومد که اول برنامه گفتم اگر هر جدولی رو نتونستی باز کنی و خراب شده بود با کد آقای توکل تعمیرش کنه و بعضی وقتها باز این لیست میاد.
3- alias یا variable پیدا نشد (not found)

binyaz2003
دوشنبه 27 فروردین 1386, 17:23 عصر
یعنی چه حالتی؟کنترل خطاها؟
به نظر من باید log بشه خطا و از برنامه خارج بشه چون ادامه روند کار خطرناک تره!

mehdi_doraghi
دوشنبه 27 فروردین 1386, 18:19 عصر
این حالات در صورت استفاده مجدد از بازکردن جدول مربوطه پیش می آید برای پیش گیری از وقوع چنین خطاها باید بعد از شروع برنامه ها برای هر جدول یک ناحیه کاری معرفی نموده و در طول برنامه از آن استفاده کن

mehran_337
سه شنبه 28 فروردین 1386, 07:44 صبح
منظورم همون کنترل خطا بود .
فکر می کنی بشه کنترلش کرد ؟؟
مورد 2 و 3 چی؟؟

binyaz2003
سه شنبه 28 فروردین 1386, 10:01 صبح
مورد 2 در پی مورد یک باز میشه یعنی اگر نتونه جدولی رو پیدا کنه یا بعضی اوقات همه چی سر جاشه اما default path عوض شده
مورد 3 و بقیه خطا ها همه با دستور on error do گرفته میشوند و در آن errorloger که مینویسی توسط کد خطا میتونی اونو تشخیص و عمل مربوطه رو انجام بدید.

mehran_337
سه شنبه 28 فروردین 1386, 15:38 عصر
علی جان ممنونم از راهنماییت منظور من هم همین بود که در برنامه کنترل خطا چه بنویسم که اگر به هر دلیلی متغیری پیدا نشد خارج نشه بلکه دستوری بدم که متغیر ساخته بشه.
از پیغام خطا می تونم اسم متغیر رو در بیارم؟؟؟؟

binyaz2003
سه شنبه 28 فروردین 1386, 17:08 عصر
هر خطای متن خاص خودش رو داره.در قسمت refrence راهنمای فاکس کتن و شماره همه خطاها هست.باید چک کنی.

rezaTavak
سه شنبه 28 فروردین 1386, 22:06 عصر
بهتره که به خطا توجه کنید نه اون را دور بزنید.

مثلا من برای باز کردن جداولم اول باز بودن اونها را با یک تابع تست میکنم و بعد اونها را باز می کنم.

mehran_337
چهارشنبه 29 فروردین 1386, 15:38 عصر
درسته . اما متاسفانه مدتی که از برنامه ام می گذره و حجیم میشه کنترلها از دستم خارج می شه . می دونم اشتباهه . اما ...
به هر حال بعضی وقتها این خطاهارو می خوام کنترل کنم می خوام بدونم بعد از اینکه پیغام 1 را داد دیگه می تونم با تابعی اسم اون ناحیه رو در بیارم
؟

rezaTavak
پنج شنبه 30 فروردین 1386, 10:34 صبح
ابتدا با کد:


ON ERROR DO errhand WITH ;
ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )

به پروسیجر هدایت میکنم و آنرا در یک بانک اطلاعاتی ذخیره میکنم:


******************************************
PROCEDURE errhand
LPARAMETER tnCodeError, tcMessageError, tcMessageError1, tcProgramName, tnLineProgramError
LOCAL lnPreSelectArea
lnPreSelectArea = SELECT()
UseDbf("Errors")
APPEND BLANK
REPLACE nCode WITH tnCodeError, cMessage WITH tcMessageError, ;
cMessage1 WITH tcMessageError1, cProgName WITH tcProgramName,;
nLineno WITH tnLineProgramError
SELECT (lnPreSelectArea)
=MESSAGEBOX( ;
'ÔãÇÑå ÎØÇ: ' + LTRIM(STR(tnCodeError))+CHR(13);
+ '�íÛÇã ÎØÇ: ' + tcMessageError+CHR(13);
+ 'ÔãÇÑå ßÏ ÈÇ ÎØÇ:' + tcMessageError1+CHR(13);
+ 'ÔãÇÑå ÎØ ÈÑäÇãå:' + LTRIM(STR(tnLineProgramError))+CHR(13);
+ 'äÇã ÈÑäÇãå ÝÚÇá: ' + tcProgramName,16,'ÎØÇ')

RETURN .F.
ENDPROC


FUNCTION USEDBF
LPARAMETERS tcTableName
IF USED(tcTableName)
SELECT (tcTableName)
ELSE
SELECT 0
USE (tcTableName)
ENDIF
ENDFUNC

Esy_Programmer
یک شنبه 30 اردیبهشت 1386, 11:34 صبح
بهترین راهی که من استفاده می کنم از ()Onerror do هست، که بعد از do نام یک تابع می نویسم و در اون تابع از errorno() یا errormessage() تشخیص می دم که خطا چی هست. و همین طور از errorline نیر برای شماره سطر دارای خطا می تونی استفاده کنی