Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Okt 21, 2020 19:17

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: C++ Exception-Handling Frage
BeitragVerfasst: Di Aug 27, 2013 19:02 
Offline
DGL Member

Registriert: Sa Apr 14, 2012 14:28
Beiträge: 52
Programmiersprache: c++
Sry dass ich wieder nerven muss, aber ich stehe gerade vor folgendem Problem:

Ich habe eine Windows-Forms-Anwendung mit VS2010 erstellt. Dabei habe ich Definitionen und Deklarationen standardmäßig in .h und .cpp-Dateien ausgelagert. Jetzt binde ich einen Header und die dazugehörige cpp-Datei ein. Darin befindet sich eine Funktion, die ich in meinem Hauptprogramm nutzen möchte. Da in dieser Funktion eine Division stattfindet, die potentiell auch mit 0 durchgeführt werden kann, habe ich den Teil in einen try-Block gefasst, ungefähr so:

Code:
  1.  
  2. Funktion x (a,b)
  3. {
  4.     try
  5.     {
  6.      if (b==0)
  7.          {
  8.          throw 1;
  9.          }
  10.       return a/b;
  11.     }
  12. }
  13.  
  14. }
  15.  
  16.  


Bitte nicht auf Flüchtigkeitsfehler achten, das hier ist nur exemplarisch. Da ich bei einem Fehler eine MessageBox ausgeben lassen will, soll der catch-Block erst in der Hauptanwendung stehen. Beim compilen schmeißt mir VS jetzt aber folgende Meldung:

Zitat:
error C2317: Der 'try'-Block ab Zeile '25' besitzt keine catch-Handler


Wo muss ich denn meinen catch-Block platzieren um ihn "global" auszuwerten und nicht bereits in der Schleife? Bei Konsolenanwendungen kann man das ja simpel in die main() packen. Bei der Windows-Forms-Anwendung hat es nicht so wirklich geklappt.

Hoffe ihr versteht mein Problem.

MfG DerTroll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Di Aug 27, 2013 19:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nun, du musst die Exception entweder nach oben propagieren lassen (also überall dort, wo du die Funktion (auch indirekt) aufrufst, einen try-catch-Block hinbauen) oder direkt in der Funktion abfangen und einen Fehlercode zurückgeben, der dann auch nach ganz oben durchgereicht werden muss.

Du kannst nicht eine Exception „weit oben“ abfangen und dann „tief unten“ die Ausführung fortsetzen. Nach der Exception wird der Aufrufstack so weit zurückgerollt, bis jemand entweder catcht oder bis alles weg ist und das programm terminiert.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Di Aug 27, 2013 20:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 573
Programmiersprache: C++
Du kannst also z.B. sowas machen:
Code:
  1. int divide(int a, int b)
  2. {
  3.   if(b == 0)
  4.     throw "division by zero";
  5.   return a / b;
  6. }
  7. void foo(void)
  8. {
  9.   divide(1, 0);
  10.   MessageBox(NULL, "lalala", "Diese Meldung wird nie ausgegeben:", MB_OK);
  11. }
  12. int irgendeine_funktion_in_deinem_programm(void)
  13. {
  14.   try {
  15.     foo();
  16.   }
  17.   catch(char* text) {
  18.     MessageBox(NULL, text, "exception", MB_ICONERROR|MB_OK);
  19.   }
  20.   return 0;
  21. }

Alles, was im try-Block steht wird dann aber nur so lange ausgeführt, bis eine Exception fliegt. Wieder zurückspringen geht nicht, wie Horazont schon schrieb. Deswegen wird die eine MessageBox nie zu sehen sein.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Zuletzt geändert von glAwesome am So Nov 17, 2013 20:27, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Mi Aug 28, 2013 00:11 
Offline
DGL Member

Registriert: Sa Apr 14, 2012 14:28
Beiträge: 52
Programmiersprache: c++
So, erstmal vielen Dank. Ich hab nicht geschnallt gehabt, dass man throw auch ausserhalb eines try-Blocks nutzen kann :roll: . Jetzt klappt es auch wie gewünscht.

MfG DerTroll

PS: Nochmals VIELEN DANK euch beiden!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Mi Aug 28, 2013 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Du kannst Dir auch eine Exception klasse schreiben und diese genauso werfen und auffangen, es muss nicht "nur" ein char* sein...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Mi Aug 28, 2013 18:17 
Offline
DGL Member

Registriert: Sa Apr 14, 2012 14:28
Beiträge: 52
Programmiersprache: c++
Ja, das weiß ich. Habe mir ne Klasse mit Konstruktor geschrieben, dem ich zwei std::string-Werte rein gebe. Einmal die Art der Exception und die Funktion in der sie aufgetreten ist. Die Frage ist halt nur, wo ich die try-catch-Blöcke hinsetze um möglichst global abzufangen. Die Strukturen von Windows-Forms-Anwendungen sind ja etwas verzweigter. Bringt es was das Application::Run(gcnew Form1()) der Haupt-cpp in den try Block zu verfrachten und dahinter alles zu catchen? --- Ich probier es mal aus.

MfG DerTroll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Do Aug 29, 2013 22:19 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
ähm...

du nutzt doch .NET, da brauchst du kein std::string da gibts String^ - oder hab ich was verpasst?

Und leitest Du deine Exception von System::Exception ab?

AppDomain::CurrentDomain hat 'nen UnhandledException Handler, den Du bemühen kannst.

Ein Try um genannte Codezeile zu packen ist, ungünstig.
Lord Helmchen hats oben schonmal geschrieben wieso das ungünstig ist.
Zitat:
"Du kannst nicht eine Exception „weit oben“ abfangen und dann „tief unten“ die Ausführung fortsetzen. Nach der Exception wird der Aufrufstack so weit zurückgerollt, bis jemand entweder catcht oder bis alles weg ist und das programm terminiert."


Wenn ich soviel Ahnung von C++ hätte wie Du, würd ich es gleich in C# machen, verwendest' ja eh /clr. Nicht's für Ungut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Fr Aug 30, 2013 10:37 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2576
Wohnort: Berlin
Programmiersprache: C/C++, C#
Ich würde auch Empfehlen mit C# .Net Anwendungen zu schreiben, statt C++.
Managed C++ ist recht Fehlerträchtig und viele .Net Features sehen im C++ Code sehr komplex aus, da sie ja nicht mit dem C++ Standard brechen dürfen.
Es ist auch recht einfach eigenen C++ Code an die C# Anwendungen an zu binden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Fr Aug 30, 2013 16:11 
Offline
DGL Member

Registriert: Sa Apr 14, 2012 14:28
Beiträge: 52
Programmiersprache: c++
phlegmatiker hat geschrieben:
ähm...

du nutzt doch .NET, da brauchst du kein std::string da gibts String^ - oder hab ich was verpasst?


Ja gibt es, nur bastle ich mir gerade einen Editor, für ein Programm, dass ohne Forms läuft. Da ich vieles wiederverwerten will und die andere Anwendung keine String^ kennt, hat meine Exception-Klasse halt std::string, weil alle Funktionen die ne Exception werfen können auch in besagtem anderen Programm zur Anwendung kommen.


phlegmatiker hat geschrieben:
Ein Try um genannte Codezeile zu packen ist, ungünstig.
Lord Helmchen hats oben schonmal geschrieben wieso das ungünstig ist.
Zitat:
"Du kannst nicht eine Exception „weit oben“ abfangen und dann „tief unten“ die Ausführung fortsetzen. Nach der Exception wird der Aufrufstack so weit zurückgerollt, bis jemand entweder catcht oder bis alles weg ist und das programm terminiert."


Naja, es macht im Grunde genau das, was ich will. Es bricht das Programm ab und sagt mir, wo der Fehler aufgetreten ist. Vielleicht habe ich meine Ziele einfach etwas missverständlich formuliert. Was ich nicht wollte ist, dass Ausgeben einer Meldung und dann weiter machen. Der Programmabbruch war schon das Ziel, nur war mir die genaue Verwendung der try-throw-catch-Anweisungen nicht so genau bewußt --- Grund: siehe nächster Abschnitt

phlegmatiker hat geschrieben:
Wenn ich soviel Ahnung von C++ hätte wie Du, würd ich es gleich in C# machen, verwendest' ja eh /clr. Nicht's für Ungut.


Die Sache ist einfach, ich habe mich bisher immer um Exception-Handling gedrückt, weil meine Projekte nie groß oder komplex genug waren, als dass es sich gelohnt hätte, da nen Hinweis auszugeben, anstatt dass Problem direkt zu fixen (z.B. Vorgabe eines fixen Alternativ-Wertes bei Division durch 0). Nur macht sich das mittlerweile eher schlecht, Gründe brauche ich sicher nicht erläutern.

Mag sein, dass ich kein C++ Guru bin, besonders in Sachen Compilereinstellungen und Linker hakt es bei mir noch gewaltig, aber Übung macht den Meister. Mir ist klar, dass meine jetzige Anwendung eigentlich nicht wirklich optimal fürs Lernen von C++ ist, aber es ist wie gesagt, ne Nebenanwendung in der ich halt einfach faul auf ne GUI-Oberfläche zurück greifen will. Deshalb sei mal nicht zu hart in deinem Urteil und kneif dir solche Formulierungen ala "Wenn ich soviel Ahnung hätte wie du"... sowas wirkt nämlich etwas herablassend und ich bin mir sicher, du hast auch mal klein angefangen. Da wolltest du solche Kommentare sicher auch nicht unbedingt hören --- Fass das bitte nur als Anmerkung auf und nicht als Streitpunkt, will dir ganz bestimmt nicht an den Karren fahren.

@TAK2004: Die Frage ist halt, ob sich das lohnt. Es ist wie gesagt ne Nebenanwendung, in der ich vieles Verwurste dass bereits Verwendung findet. Sich da nochmal ne neue Syntax anzutun... ich weiß nicht. So viel Windows Forms brauche ich gar nicht. Nur ein paar Buttons und nen OpenGL Fenster. Der Rest ist unabhängig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Fr Aug 30, 2013 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2576
Wohnort: Berlin
Programmiersprache: C/C++, C#
C++ Framework/Engine und oft auch Game Code ist in allen Fällen, die ich gesehen hab Exception Free.
Exception Handling ist in C++ Prinzipiell Möglich und wird auch weiter Entwickelt, so wurde das Exception Handling in C++11 teilweise geändert und ist so wie ich das gesehen hab auch nicht mit c++98 Kompatibel aber geben eine Trügerische Sicherheit.
In 99,999% der Fälle produziert man damit Memleaks oder ungewollte Folgefehler.
Auf diese Problematik haben sich die Änderungen in C++11 hauptsächlich bezogen.
Exceptions Fragmentieren den Speicher, können recht schnell mal den Programmfluss auf dem Kopf stellen und wenn man in der Exception noch eine Exception produziert hat man sehr viel Spaß.
Es gibt für Exceptions bei den STL Funktionen und einigen OS API's extra Parameter, damit dich kein Exception Handling machen, sondern Fehler als ErrorCode oder ErrorFlag zurück geben.

Wenn man ohne Exception arbeitet, dann ist der Code für Neulinge einfacher zu lesen und verstehen.

Das ist aber recht speziell, weil bei C# und Java wird nahzu immer Anwendungsentwicklung betrieben und da ist weder Geschwindigkeit noch Memleaks ein Problem. Daher lohnt es sich dort mit Exceptions zu arbeiten.

Was ich in mehreren Firmen hab ich schon gesehen, dass die C++ Code als native library bauen und dann mit C# auf diese zugreifen.
Der Editor kann z.B. die dll/so laden, ein Fensterhandle übergeben und eine Netzwerkverbindung aufbauen.
Der Native Code baut dann auf dem Fensterhandle ein Render Context, erstellt nen socket und verbindet zum Server im Editor.
Die ganze Kommunikation kann dann über TCP/UDP laufen, statt alle Funktionen nach aussen zu legen.
Das Konzept hab ich schon bei 2 Firmen im Code gesehen und macht auch Sinn.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Fr Aug 30, 2013 19:12 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2023
Programmiersprache: C++
Tak, kannst du genaueres zu den Problemen von C++ und Exception schreiben? Vielleicht auch mit Beispiel?
Mir fällt als Problem nur der Verlust von Referenzen und die da mit erfolgenden Memory Leaks. Aber dieses Problem hat z.B. Delphi auch und ließe sich in C++ z.B. durch Smart Pointer umgehen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Fr Aug 30, 2013 23:42 
Offline
DGL Member

Registriert: Sa Apr 14, 2012 14:28
Beiträge: 52
Programmiersprache: c++
@Tak: hm... das mit dem Exception free ist so ne Sache. Bisher habe ich ja auch immer versucht das Thema zu umschiffen indem ich alle möglichen Fehlerquellen durchdenke und diese entweder gleich verhindere oder halt im Fall der Fälle eine Alternativlösung angebe anstatt ne Exception zu schmeißen. Der Grund warum ich jetzt Exceptions verwenden will ist hauptsächlich zum debuggen. Wenn ich beispielsweise die Normale zu 2 Vektoren berechnen lasse, die in die selbe Richtung zeigen, gibt es keine mathematisch korrekte Lösung. Fange ich das jetzt ab indem ich sage "nimm dann halt Richtung XY" produziert das mitunter Folgefehler, deren wahre Ursache sich dann schwer finden lässt (z.B. bei der Grafikausgabe entstehen seltsame Fragmente).

Deshalb soll mein Programm auch sofort abbrechen und mir einen Anhaltspunkt über die Fehlerquelle geben, damit ich nochmal nachbessern kann. Ich habe mich noch nicht genau mit Kompiler-Anweisungen beschäftigt, aber es sollte doch sicherlich möglich sein dem Compiler zu sagen, bestimmte Code-Blöcke nur zu nutzen, wenn im DeBug-Modus kompiliert wird. Da könnte ich dann die gesamte Exception-Geschichte mit für die Release-Version "ausklammern".

Letztendlich will ich erstmal C++ halbwegs durchblicken, bevor ich mir C# gebe, auch wenn es für das jetzige Projekt vielleicht einfacher und sinnvoller wäre und der ganze .NET kram da vielleicht etwas kontraproduktiv ist. Da ich eher aus Hobby-Gründen programmiere und was anderes technisches studiert habe, lernt sich ne neue Programmiersprache halt nicht so schnell wie als Informatik-Student. :)

MfG DerTr0ll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Sa Aug 31, 2013 10:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Man kann für solche Checks auch assert() (aus dem Header cassert)verwenden, welches man optional nicht mit einkompiliert. Da ist dann für den Leser auch sofort klar, dass es sich hier um einen sanity check handelt.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Sa Aug 31, 2013 12:24 
Offline
DGL Member

Registriert: Sa Apr 14, 2012 14:28
Beiträge: 52
Programmiersprache: c++
Hm... assert() klingt schon ganz gut. Andererseits kann ich mir damit keine Error-Log schreiben lassen für das Debugging durch andere Personen... . Alles nicht so einfach... :cry:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C++ Exception-Handling Frage
BeitragVerfasst: Sa Aug 31, 2013 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Assert bricht mit einer Fehlermeldung, die die fehlgeschlagene Bedingung sowie das Sourcefile und die Programmzeile enthält, ab.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.056s | 19 Queries | GZIP : On ]