Zum Inhalt springen

catch


wulfgang

Empfohlene Beiträge

Hallo, ich bekomme bei der Anwendung von catch auf einmal lauter Fehler.:( D

try {



	//Servername wird aus INI-Datei gelesen

	    int laenge; //Ist nur eine Hilfsvariable um den Rückgabewert zu pruefen

		GetPrivateProfileString(szSectionName,

										szKeyName_s,

										DefaultValue,

										servername,

										(sizeof(servername))/(sizeof(wchar_t)),

										szFilename);

		cout << GetLastError()<<"\n";

		wcout << servername << "\n"; 

	}

	catch (CException *error_read) 	

	{

        TCHAR szCause[1024];

		error_read->GetErrorMessage(szCause,1024);

        printf_s("ERROR!  %S\n", szCause);

        error_read->Delete();

    }

syntax error : identifier 'CException'

'error_read' : undeclared identifier

Das ist nur ein Teil der Fehlermeldungen. ich verstehe hier einfach nicht warum undeclared identifier-ich error_read doch definiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist der Syntax Error denn sicher die erste?
ja

Hier alle Meldungen aufgelistet

error C2310: catch handlers must specify one type

error C2065: 'error' : undeclared identifier

error C2227: left of '->GetErrorMessage' must point to class/struct/union/generic type

error C2227: left of '->Delete' must point to class/struct/union/generic typeerror C2317: 'try' block starting on line '22' has no catch handlers

error C2065: 'laenge' : undeclared identifier

Es scheint am weiteren Umfeld zu liegen.
Bevor ich versucht habe, das Exception-Handling einzubauen, hatte ich keine Fehler. :( Die Variablen wie nameserver, login_user, password habe ich als wchar_t in der Headerdatei definiert.

#include "StdAfx.h"

#include "read_serverlist.h"

#include <windows.h>

#include <fstream> 

#include <wchar.h>

#include <wctype.h>

#include <iostream>

using namespace std;


wchar_t DefaultValue[50] = L"DefaultValue";


wchar_t* read_serverlist::servername;

read_serverlist::read_serverlist(void)

{


	wchar_t szSectionName[] = L"name";

	wchar_t szKeyName_s[] = L"server";

	wchar_t szFilename[] = L"C:/Dokumente und Einstellungen/user/Eigene Dateien/Visual Studio 2005/Projects/automatic_transfer.sln/serverlist.ini";    

                            //Hier den pfad der ini eintragen

	wchar_t nameserver[256];

	try

	{

	//Servername wird aus INI-Datei gelesen

	    int laenge; //Ist nur eine Hilfsvariable um den Rückgabewert zu pruefen

		GetPrivateProfileString(szSectionName,

										szKeyName_s,

										DefaultValue,

										nameserver,

										(sizeof(nameserver))/(sizeof(wchar_t)),

										szFilename);

		cout << GetLastError()<<"\n";

		wcout << nameserver << "\n"; 

		servername=nameserver;

		wcout << servername;

	}

		catch(CException* error)

    {

        TCHAR szCause[1024];

		error->GetErrorMessage(szCause,1024);

        printf_s("ERROR!  %S\n", szCause);

        error->Delete();

    }

	//User wird aus INI-Datei gelesen

		wchar_t szKeyName_u[] = L"login_user";

		laenge=GetPrivateProfileString(szSectionName,

										szKeyName_u,

										DefaultValue,

										login_user,

										(sizeof(login_user))/(sizeof(wchar_t)),

										szFilename);

		wcout << login_user;

		cout << laenge << "\n";

	//Passwort wird aus INI-Datei gelesen

		wchar_t szKeyName_p[] = L"password";

		laenge=GetPrivateProfileString(szSectionName,

										szKeyName_p,

										DefaultValue,

										password,

										(sizeof(password))/(sizeof(wchar_t)),

										szFilename);

		wcout << password ;

		cout << laenge << "\n";

	//Herkunft der Textdatei wird aus INI-Datei gelesen

		wchar_t szKeyName_t_s[] = L"source_txt";

		laenge=GetPrivateProfileString(szSectionName,

										szKeyName_t_s,

										DefaultValue,

										source_txt,

										(sizeof(source_txt))/(sizeof(wchar_t)),

										szFilename);

		wcout << source_txt ;

		cout << laenge << "\n";

	//Ziel der Textdatei  wird aus INI-Datei gelesen

		wchar_t szKeyName_t_d[] = L"destination_txt";

		laenge=GetPrivateProfileString(szSectionName,

										szKeyName_t_d,

										DefaultValue,

										destination_txt,

										(sizeof(destination_txt))/(sizeof(wchar_t)),

										szFilename);

		wcout << destination_txt ;

		cout << laenge << "\n";


	//Ziel der zu übertragenden Daten wird gelesen

		wchar_t szKeyName_f_d[] = L"destination_folder";

		laenge=GetPrivateProfileString(szSectionName,

										szKeyName_f_d,

										DefaultValue,

										destination_folder,

										(sizeof(destination_folder))/(sizeof(wchar_t)),

										szFilename);

		wcout << destination_folder ;

		cout << laenge << "\n";

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

GetPrivateProfileString ist eine WinAPI-Funktion, die wirft keine Exception
Okay, das wußte ich nicht.

Ist das überhaupt ein MFC-Projekt?
Ja ich benutze ja in anderen Klassen zum Beispiel auch CInternetSession.

Wie kann ich denn sonst einen Fehler abfangen, wenn keine Exceptions ausgeworfen werden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Funktion tut, wenn sie den gesuchten Eintrag nicht finden kann: Sie kopiert den Defaultstring in den Ergebnispuffer.

In meinem Fall leider nicht. Deswegen hatte ich auf catch gehofft. Während der Ausführung des Programms erhalte ich:

First-chance exception at 0x7c920aa8 in automatic_transfer.exe: 0xC0000005: Access violation writing location 0x00000000.

Unhandled exception at 0x7c920aa8 in automatic_transfer.exe: 0xC0000005: Access violation writing location 0x00000000.

wchar_t* read_serverlist::servername;

read_serverlist::read_serverlist(void)

{

GetPrivateProfileString(szSectionName,

szKeyName_s,

DefaultValue,

servername,//vom Compiler markiert

(sizeof(servername))/(sizeof(wchar_t)),

szFilename);//vom Compiler markiert

cout << GetLastError()<<"\n";

wcout << servername << "\n";//vom Compiler markiert
} In read_serverlist.h
#pragma once


class read_serverlist

{

public:

	read_serverlist(void);

	static wchar_t *read_serverlist::give_data(void);

	static wchar_t *servername;


	wchar_t login_user[50];

	wchar_t password[50];

	wchar_t source_txt[50];

	wchar_t destination_txt[50];

	wchar_t destination_folder[50];

public:

	~read_serverlist(void);

};

Link zu diesem Kommentar
Auf anderen Seiten teilen

In meinem Fall leider nicht. Deswegen hatte ich auf catch gehofft.
Du hast da eine Access violation, die kannst du laut Standard sowieso nicht mit try/catch fangen (obwohl MSVC das trotzdem kann).

Aber das solltest du nicht tun. Statt dessen solltest du rausfinden, wo du da einen Nullzeiger benutzt. Denn genau das ist das Problem:

Access violation writing location 0x00000000.

Vielleicht wäre es mal an der Zeit, den Debugger anzuwerfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich hatte in der Zwischenzeit noch eine andere Lösung probiert.Ich erzeuge ein Objekt und greife anschließend auf die Eigenschaft zu. Dann brauche ich ja nicht mit static und so weiter tricksen. Wenn ich statt wchar_t int verwende funktioniert es auch. Bei wchar_t wird wird jedoch nichts ausgegeben.

read_serverlist::read_serverlist(void)

{

	GetPrivateProfileString(szSectionName,

szKeyName_s,

DefaultValue,

servername,

(sizeof(servername))/(sizeof(wchar_t)),

szFilename);

cout << GetLastError()<<"\n";

wcout << servername << "\n"; //Hier wird noch richtig ausgegeben

}

wchar_t read_serverlist::give_data(void)

{

	cout << "test"; //ausgegeben

	return servername[250]; 


}
Aufrudende Umgebung
read_serverlist LeseListe;

wcout << LeseListe.give_data();//Hier wird nichts ausgegeben, bei int als Rückgabe funktioniert es jedoch
In read_serverlist.h
#pragma once


class read_serverlist

{

public:

	read_serverlist(void);

	wchar_t read_serverlist::give_data(void);

	wchar_t servername[250]; //bei Eigenschaft als int funktioniert

	wchar_t login_user[250];

	wchar_t password[150];

	wchar_t source_txt[150];

	wchar_t destination_txt[250];

	wchar_t destination_folder[250];

public:

	~read_serverlist(void);

};

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich habe jetzt eine Lösung gefunden. Wußte gar nicht, dass ich bei öffentlichen Eigenschaften auch direkt zugreifen kann.

aufrufende Umgebung:

wcout << LeseListe.servername;

Dann nrauche ich ja überhaupt keine extra Funktion zum ausgeben.:)

Auch wenn mich interessieren würde, wie ich hier ein gesamtes Array übergeben kann. Muss ja irgendwie die Adresse eines Zeiger auf die entsprechende Eigeschaft sein, oder?

Bearbeitet von wulfgang
Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich habe jetzt eine Lösung gefunden. Wußte gar nicht, dass ich bei öffentlichen Eigenschaften auch direkt zugreifen kann.
Public Member sind keine Lösung, sondern ein Bruch der Kapselung.

Dann nrauche ich ja überhaupt keine extra Funktion zum ausgeben.:)
Und auch keine zum Ändern ;)

Jede Klasse kann darin rumwurschteln, wie sie will. Dann kannst du auch gleich globale Variablen benutzen.

Auch wenn mich interessieren würde, wie ich hier ein gesamtes Array übergeben kann.
Was meinst du jetzt mit "hier"? Eine Funktion kann kein Array zurückgeben.

Vielleicht solltest du mal von char-Arrays weg hin zu Stringklassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...