Powered by Invision Power Board


  Reply to this topicStart new topic

> Exceptions funktionieren nur in IDE..., Nur in der IDE werden Exceptions erkannt
ZENeca
geschrieben am: 18.03.2009, 20:14
Quote Post





Gruppe: Mitglieder
Beiträge: 5
Mitglieds-Nr.: 730
Mitglied seit: 18.03.2009



...und nicht mal das Richtig

Hallo liebe Gemeinde,

weia liegt der letzte Eintrag lang zurück aber: Versuch macht kluch.

Mir will es nicht gelingen auch nur irgend eine Exception außerhalb der IDE
richtig anzuzeigen, geschweige denn abzufangen.
Probiert habe ich VCL Exceptions (EdivZero) und auch selbst geschriebene.
Außerhalb der IDE bekomme ich immer nur die Meldung:
Unbekannter Softwarefehler (0x...) in Anwendung an Stelle 0x.... ist aufgetreten
Innerhalb der IDE bekomme ich die richtige Meldung angezeigt,
aber die catch-Squenz will er auch nicht abarbeiten

Muß ich noch irgend etwas anderes in der Entwicklungsumgebung deaktivieren,
daß in der Laufzeit (ohne IDE) keine Meldung aufpoppt?

Ich benutze Version BCB5 – Enterprise

würde mich um eine paar erhellende Gedanken sehr freuen.

PMEmail Poster
Top
Merlin
geschrieben am: 18.03.2009, 21:43
Quote Post





Gruppe: Mitglieder
Beiträge: 172
Mitglieds-Nr.: 376
Mitglied seit: 17.05.2005



Ok, dann zeige mal den Code.
PM
Top
NetPanther
geschrieben am: 18.03.2009, 23:45
Quote Post


Administrator


Gruppe: Administratoren
Beiträge: 7.696
Mitglieds-Nr.: 1
Mitglied seit: 29.08.2004



Guten Abend,

generell musst du zwischen Debug Build und Release Build unterscheiden. Ersteres ist in der Regel etwas geschwätziger, was Fehler und Ausnahmen anbelangt. Ich habe keinen Borland C++Builder 5 vorliegen, aber in der Regel kann man den gewünschten Typ vor dem Bauen des Projekts im Build Manager einstellen.

Für die allgemeine Verwendung von Exceptions gibt es sogenannte Kompiler-Direktiven. Mit diesen kannst du die Fehlerbehandlung auf Wunsch komplett abschalten, damit der Benutzer deiner Anwendung gar keine Fehlermeldungen mehr angezeigt bekommt. Auch diese Option findest du in der Konfiguration des Borland C++Builder.

Wie in der Entwicklungsumgebung mit Ausnahmen verfahren wird, ist - oh Wunder - ebenfalls Einstellungssache. Schau mal durch die Optionen deiner IDE, dort wirst du die gewünschte Arbeitsweise detailliert festlegen können (z.B. bei Fehlern nicht anhalten, sondern einfach fortfahren).

Das Abfangen von Fehlern an sich ist kein Hexenwerk und mit wenigen Handgriffen erledigt:
CODE
void __fastcall TForm1::Button1Click(TObject *Sender(
{
  try
  {
     int i = 1 / Edit1->Text.ToInt();
  }
  catch (EDivByZero &e)
  {
     Label1->Caption = "Division durch Null.";
     break;      
  }
  catch (EConvertError &e)
  {
     Label1->Caption = "Eingabe war keine Ganzzahl.";
     break;
  }
}


Ansonsten kann ich mich nur Merlin anschließen. Zeig uns deinen bisherigen Code und wir werden schauen, wo das Problem seine Wurzel hat.

MfG


--------------------
:: NetPanther :: NetPanther@gmx.net :: Website :: IRC Channel: #NetPanther ::

Das Leben ist eine Beta. Nichts ist vollkommen.
PMEmail PosterUsers WebsiteICQAOLYahooMSN
Top
ZENeca
geschrieben am: 20.03.2009, 02:13
Quote Post





Gruppe: Mitglieder
Beiträge: 5
Mitglieds-Nr.: 730
Mitglied seit: 18.03.2009



Erst mal besten Dank für die schnelle Reaktion.

Meinst du mit Debug- Release Version die Option
Debug oder endgültige Version?

aber erst mal zu deinem Beispiel:
Oh Wunder, oh Staun: dat funktioniert!?!
(ich vermute mal, daß deine beiden breaks ein Versehen sind)
Mein Testprogramm sah nicht viel anders aus,
einzig wesentlicher Unterschied ist,
daß meins eine Konsolenanwendung ist,
gibt's da irgend welche Unterschiede?
...oder ist mir etwas anderes entgangen?


CODE
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>

int divme(int i, int j) {
 int ret = i / j;
 return ret;
}

//--------------------------------------

int main(int argc, char* argv[])  {
 try {
   int back_from_div = divme(7, 0);
 }
 catch(EDivByZero &E)  {
   printf("div by 0\n");
   cout << E.Message.c_str();
 }
 return 0;
}


Beitrag bearbeitet von ZENeca am 20.03.2009, 02:18
PMEmail Poster
Top
Muetze1
geschrieben am: 20.03.2009, 16:58
Quote Post





Gruppe: Moderatoren
Beiträge: 561
Mitglieds-Nr.: 4
Mitglied seit: 31.08.2004



Hallo!

Binde doch mal bitte die SysUtils.hpp als erstes Include ein und erstelle das Projekt erneut.

Gruss,
Muetze1


--------------------
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21

WhatPulse Team Stats
PMEmail PosterUsers Website
Top
ZENeca
geschrieben am: 20.03.2009, 17:39
Quote Post





Gruppe: Mitglieder
Beiträge: 5
Mitglieds-Nr.: 730
Mitglied seit: 18.03.2009



Hallo Muetze,

besten Dank für den Tip,
hat aber leider nichts gebracht :(

...was auch ein bisschen eigenartig ist, ist die Tatsache, daß er beim Ausführen
drei "unknown Exceptions" auslöst.
Zwei mal 0x94 (beide an der gleichen Stelle) und dann noch eine 0x27
PMEmail Poster
Top
Merlin
geschrieben am: 20.03.2009, 18:17
Quote Post





Gruppe: Mitglieder
Beiträge: 172
Mitglieds-Nr.: 376
Mitglied seit: 17.05.2005



Hallo,

mich würde mal das ASM - Listing interessieren. Dort sieht man wenigstens mal was er rausschreibt und ob er einen Handler an FS:[0] hängt, wie er try umsetzt usw.

Kann aber durchaus ein Konfigurationsproblem sein. Ich kenne den BCB nicht wirklich. (bevor ichs vergesse, bitte die Codes der unabgefangenen Exceptions nicht Auspunkten).

Gruß,

Merlin

Beitrag bearbeitet von Merlin am 20.03.2009, 18:42
PM
Top
Merlin
geschrieben am: 21.03.2009, 11:48
Quote Post





Gruppe: Mitglieder
Beiträge: 172
Mitglieds-Nr.: 376
Mitglied seit: 17.05.2005



Und wenns geht auch mal catch (...), also ein catch all probieren.
PM
Top
ZENeca
geschrieben am: 22.03.2009, 18:55
Quote Post





Gruppe: Mitglieder
Beiträge: 5
Mitglieds-Nr.: 730
Mitglied seit: 18.03.2009



bin mir jetzt nicht so sicher was du sehen willst,
leider kann man keine Bilder anhängen,
so mußte ich einen gewöhnlichen Dissassambler bemühen
und das ist nicht ganz so übersichtlich,
aber ich hoffe du findest die Info nach der du suchst

....catch(...) hab ich auch probiert, ändert aber leider nichts,
habe auch das Gefühl, daß er die catch-sequenz gar nicht mehr abarbeitet


CODE


int main(int argc, char* argv[])  {

1000:0040119c 55                   push   ebp
1000:0040119d 8bec                 mov    ebp, esp
1000:0040119f 83c4d4               add    esp, -2ch
1000:004011a2 53                   push   ebx
1000:004011a3 56                   push   esi
1000:004011a4 57                   push   edi
1000:004011a5 c745e024214000       mov    dword ptr [ebp-20h], 402124h
1000:004011ac 8965e4               mov    [ebp-1ch], esp
1000:004011af b8b7174000           mov    eax, 4017b7h
1000:004011b4 8945dc               mov    [ebp-24h], eax
1000:004011b7 66c745e80000         mov    word ptr [ebp-18h], 00h
1000:004011bd 648b1500000000       mov    edx, dword ptr fs:[00h]
1000:004011c4 8955d8               mov    [ebp-28h], edx
1000:004011c7 8d4dd8               lea    ecx, [ebp-28h]
1000:004011ca 64890d00000000       mov    dword ptr fs:[00h], ecx

try {

1000:004011d1 66c745e80800         mov    word ptr [ebp-18h], 08h

int back_from_div = divme(7,0);

1000:004011d7 6a00                 push   00h
1000:004011d9 6a07                 push   07h
1000:004011db e8a8ffffff           call   loc_00401188
1000:004011e0 83c408               add    esp, 08h
1000:004011e3 8945d4               mov    [ebp-2ch], eax
1000:004011e6 66c745e80800         mov    word ptr [ebp-18h], 08h

}

1000:004011ec 66c745e80000         mov    word ptr [ebp-18h], 00h
1000:004011f2 eb16                 jmp    loc_0040120a

printf("div by 0\n");

1000:004011f4 68                   db     68h    ;'h'
1000:004011f5 f8                   db     0f8h
1000:004011f6 20                   db     20h    ;' '
1000:004011f7 40                   db     40h    ;'@'
1000:004011f8 00                   db     00h
1000:004011f9 e8                   db     0e8h
1000:004011fa 94                   db     94h
1000:004011fb 07                   db     07h
1000:004011fc 00                   db     00h
1000:004011fd 00                   db     00h
1000:004011fe 59                   db     59h    ;'Y'
1000:004011ff 66                   db     66h    ;'f'
1000:00401200 c7                   db     0c7h
1000:00401201 45                   db     45h    ;'E'
1000:00401202 e8                   db     0e8h
1000:00401203 10                   db     10h
1000:00401204 00                   db     00h
1000:00401205 e8                   db     0e8h
1000:00401206 f8                   db     0f8h
1000:00401207 06                   db     06h
1000:00401208 00                   db     00h
1000:00401209 00                   db     00h
1000:0040120a;                                   XREFS First: 1000:004011f2 Number : 1
1000:0040120a loc_0040120a:

return 0;

1000:0040120a 33c0                 xor    eax, eax
1000:0040120c 8b55d8               mov    edx, [ebp-28h]
1000:0040120f 64891500000000       mov    dword ptr fs:[00h], edx

}


falls noch irgend eine Info gewünscht wird
werfde ich sie liefern, aber langsam gebe ich die Hoffnung auf,
und mir graust schon vor dem Workarround
bei meiner komplexen Applikation sad.gif(

Beitrag bearbeitet von ZENeca am 22.03.2009, 18:56
PMEmail Poster
Top
Merlin
geschrieben am: 23.03.2009, 02:22
Quote Post





Gruppe: Mitglieder
Beiträge: 172
Mitglieds-Nr.: 376
Mitglied seit: 17.05.2005



Hallo,

ersetze mal try durch __try und catch (...) durch __except (EXCEPTION_EXECUTE_HANDLER). Dann sollte das funktionieren, glaube ich.

Gruß,

Merlin.

Beitrag bearbeitet von Merlin am 23.03.2009, 02:25
PM
Top
ZENeca
geschrieben am: 24.03.2009, 11:30
Quote Post





Gruppe: Mitglieder
Beiträge: 5
Mitglieds-Nr.: 730
Mitglied seit: 18.03.2009



warum habe ich denn von dem letzten Beitrag keine Mailmeldung bekommen?!?!
...hätte ich ja lange warten können *grummel

sehr cool dein Lösungsansatz, hab's gerade probiert und das klappt.
Wie bist Du den darauf gekommen,
War das reine Erfahrung oder analytische Fähigkeit?

Aber ich war auch nicht untätig:
Habe mich mit der Entwicklungsumgebung herumgeärgert
und's auf anderen PCs versucht und gerade hat's dann doch geklappt

Man muß beim Anlegen des Projektes mit dem Konsolenexperten
die Option "VCL verwenden" anwählen

der Hilfetext gibt leider keine richtige Auskunft was dann genau anders läuft
z.B. heißt es, daß die Linkeroptionen anders gesetzt werden,
doch beim Vergleich habe ich keinen Unterschied gefunden, dann
...mom der Text

VCL verwenden:
Erstellt eine DLL, die VCL-Komponenten enthalten kann. Diese Option steht nur für C++-Quellmodule zur Verfügung.
Mit dieser Option wird die Datei VCL.h einbezogen und der Startcode sowie die Linker-Optionen werden geändert,
um Kompatibilität zu den VCL-Objekten zu erreichen.

"Erstellt eine DLL", die VCL-Komponenten "enthalten kann"
was ist das für ein Text, außerdem habe ich keine neue DLL gefunden

hmm.

jetzt noch die Frage an die Builderfreaks:
Es wäre noch schön zu wissen, ob ich die Einstellung nachträglich vornehmen kann oder,
ob ich das gesamte Projekt neu anlegen muß?

und jetzt vielleicht noch die Info für was das alles gut war, bzw. gut sein wird.
Ich denke zwar, daß das für euch Hardcoreprogrammierer nicht wirklich interessant ist,
da sich die Software genau an die Leute richtet die nicht programmieren aber abstrahieren können,
aber eine Gelegenheit Webung dafür zu machen möchte ich auch nicht auslassen
...und keine Sorge, ist ein Open-Source Projekt

Oksimo Website
(ist noch im Aufbau)

Beitrag bearbeitet von ZENeca am 24.03.2009, 11:32
PMEmail Poster
Top
Muetze1
geschrieben am: 24.03.2009, 18:46
Quote Post





Gruppe: Moderatoren
Beiträge: 561
Mitglieds-Nr.: 4
Mitglied seit: 31.08.2004



Hallo!

Du könntest nachträglich natürlich die Spare Libs etc direkt in der Projektdatei ändern, aber das wäre recht aufwendig. Grundsätzlich besteht dein Problem auch nur, da du ja versuchst VCL Objekte zu handhaben (die Exceptions der VCL sind VCL Objekte und EConvertError ist eine solche). Wenn du die reine STL bzw. C Funktionen nutzen würdest, dann hättest du auch kein Problem und könntest auch die C++ Exceptions ordentlich handeln.

Aber nun gut, das Problem ist ja nun gelöst. Grundsätzlich ist es aber nicht so einfach zu durchschauen beim BCB.

Gruss,
Muetze1


--------------------
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21

WhatPulse Team Stats
PMEmail PosterUsers Website
Top
1 Besucher zu diesem Thema (1 Gäste und 0 'versteckte' Mitglieder)
0 Mitglied(er):

Topic Options Reply to this topicStart new topic

 



[ DB Queries: 11 ]   [ Execution Time: 0.0552 ]   [ GZIP aktiviert ]