Tam Sürümünü Görmek İçin : Hata Yakalama
Merhaba
Borland C++ 6.0 kullanıyorum.
Projemde, projenin genelindeki herhangi bir alanda yaşanabilecek olası bir hatayı yakalamak istiyorum. Projemde bir hatayla karşılaşıldığında proje haricinde bir program çalıştırmak, yada bir form görüntülemek istiyorum.
Nasıl yapabilirim?
Tşk.
"try except" olarak arastirmayi denedin mi?
Ayıklayacağım hata bir kod betiğinde yada fonksiyonda değil tüm projenin içinde herhangi biryerde.
Hatayı yakalamak için Programın tüm kodlarına Try Except metodu uygulamam imkansız.
Projede Global hata yakalamak amacındayım.
acehreli
31/01/2008, 00:48
Nasil yapildigini bilmiyorum ama Windows Registry'de bir yere program hatalarinda neyin calistirilmasi gerektigini soyleyebiliyorsun. Sanirim normalde Dr. Watson calisiyor. Belki onun yerine kendi programini yazabilirsin.
Ali
Harici bir form çalıştırıp kullanıcıya hatayı bildirmek çözüm değil ki.
Hatayı düzeltmek veya oluşacak hataları program içerisinde yakalayıp program akışını ona göre yönlendirmek bence daha doğru.
Program açılırken gerekli program dosyalarından biri eksikse bunu tespit etmek zor değil.
Şayet kontrolümüz dışında bir hata çıkabilecek yer varsa -Yani her şey yukarıdaki gibi basit değilse- bunu da try-except kod bloğu içine almamız gerekli.
Yazması pek kolay bir şey olmasada şöyle yapabilirsin
Basit bir debugger yazıp diğer programı onunla çalıştırırsın
yani
CreateProcess ile DEBUG_PROCESS seçeneğiyle programını çalıştırırsın
WaitForDebugEvent ile gelen DEBUG_EVENT leri değerlendirip gerekeni yaparsın
detaylarını araştırırsın artık :)
Harici bir form çalıştırıp kullanıcıya hatayı bildirmek çözüm değil ki.
Hatayı düzeltmek veya oluşacak hataları program içerisinde yakalayıp program akışını ona göre yönlendirmek bence daha doğru.
Program açılırken gerekli program dosyalarından biri eksikse bunu tespit etmek zor değil.
Şayet kontrolümüz dışında bir hata çıkabilecek yer varsa -Yani her şey yukarıdaki gibi basit değilse- bunu da try-except kod bloğu içine almamız gerekli.
Bugün Microsoft'un aylarca hazırlayıp piyasaya sürdüğü yazılımlar bile hata üretebiliyor. Diyelimki program yinede kusursuz, sistemde bellek taştı her program bir şekilde muhakkak hata üretebilir. Kullanıcıya bu hatayı C++ debug mesajı yerine başka bir form çıkartmak istiyorum. Evt Try Except bloğu içine alabilirim ancak programda yüzlerce fonksiyon, binlerce satır kod var. Tüm bu kodları ayrı ayrı try-except içine almam haliyle pek akıl karı diyil.
Program hata ürettiği zaman C++ kendi tanımladığı bir kod mesajını ekrana basıyor. Bu kod mesajının çalıştığı betiği bulmaya çalıştım ama sanırım bu ön tanımlı bir işlem.
Araştırmaya devam ediyorum, yinede aklına birşey gelen olursa paylaşırsan sevinirim.
Tşk.
Belki biraz geç ama yeni farkettim...
Benzer bir çalışma yapmıştım.
Kullandıklarımdan ilgili kısımları buraya kopyalayım siz içerisinden gerekeni çıkartabilirsiniz.
__fastcall TFrmAna::TFrmAna(TComponent* Owner)
: TForm(Owner)
{
Application->OnException = Hataci;
}
-----------------------
private:
void __fastcall Hataci(TObject *Sender, Exception *Hata);
-----------------------
void __fastcall HataTakip(Exception *Hata)
{
char cHata[180];//, hataZamani[35], hataTipi[25], hataMesaji[100];
strcpy(cHata, ("Hata Zamanı : " + DateTimeToStr(Now().CurrentDateTime()) + "\t").c_str());
strcat(cHata, ("Hata Tipi : " + Hata->ClassName() + "\t").c_str());
strcat(cHata, ("Hata Mesajı : " + Hata->Message + "\n").c_str());
FILE * hataLog;
if((hataLog = fopen("hata.szn", "at")) == NULL) return;
fwrite(cHata, sizeof(char), strlen(cHata), hataLog);
fclose(hataLog);
AnsiString asHataTipi = Hata->ClassName();
if(asHataTipi == "EJPEG") return;
AnsiString asMesaj = "Program aşağıdaki hata ile kesintiye uğradı!\n"
"Bu hata uyarısı kayıt altına alınmıştır.\n"
"önemli olduğunu düşünüyorsanız lütfen .... ile irtibat kurunuz."
"\n"
"Orjinal Hata Mesajı : " + Hata->Message;
Application->MessageBox(asMesaj.c_str(), "ASOZA Hata Uyarısı!", MB_OK + MB_ICONEXCLAMATION);
/*
EAbort Stops a sequence of events without displaying an error message dialog box.
EAccessViolation Checks for invalid memory access errors.
EBitsError Prevents invalid attempts to access a Boolean array.
EComponentError Signals an invalid attempt to register or rename a component.
EConvertError Indicates string or object conversion errors.
EDatabaseError Specifies a database access error.
EDBEditError Catches data incompatible with a specified mask.
EDivByZero Catches integer divide-by-zero errors.
EExternalException Signifies an unrecognized exception code.
EInOutError Represents a file I/O error.
EIntOverflow Specifies integer calculations whose results are too large for the allocated register.
EInvalidCast Checks for illegal typecasting.
EInvalidGraphic Indicates an attempt to work with an unrecognized graphic file format.
EInvalidOperation Occurs when invalid operations are attempted on a component.
EInvalidPointer Results from invalid pointer operations.
EMenuError Involves a problem with menu item.
EOleCtrlError Detects problems with linking to ActiveX controls.
EOleError Specifies OLE automation errors.
EPrinterError Signals a printing error.
EPropertyError Occurs on unsuccessful attempts to set the value of a property.
ERangeError Indicates an integer value that is too large for the declared type to which it is assigned.
ERegistryException Specifies registry errors.
EZeroDivide Catches floating-point divide-by-zero errors.
*/
}
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.