Toon posts:

C++ Error handling

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Bij het openen van een file in een console applicatie wil ik checken of de file wel bestaat. De filename wordt als parameter meegegeven tijdens het executen.
Ik dacht dit te doen met try en catch maar het wil niet echt lukken. Weten jullie wat ik fout doe ?

Dit is de code (_argv[1] is de eerste parameter die wordt meegegeven.) :

const char * filename = _argv[1];
try{
ifstream file (filename, ios::in|ios::binary|ios::ate);
throw 1;
}
catch(int a)
{
cout << "File error!" << endl;
}


Groet,
Raymond

  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:21
waarom niet zo?
code:
1
2
3
4
5
6
7
8
9
10
11
#include <files.h>
#include <stdio.h>

int main(int _argn, char argv[])
{
  if(!fopen(_argv[1]))
  {
     cout << "File error!" << endl;
  }
  return 0;
}

Disclaimer: deze code is niet getest en er kunnen fouten in zitten!

Verwijderd

Op maandag 18 februari 2002 11:22 schreef Marcj het volgende:
waarom niet zo?
code:
1
2
3
4
5
6
7
8
9
10
11
#include <files.h>
#include <stdio.h>

int main(int _argn, char argv[])
{
  if(!fopen(_argv[1]))
  {
     cout << "File error!" << endl;
  }
  return 0;
}

Disclaimer: deze code is niet getest en er kunnen fouten in zitten!
Nou sommige mensen houden hier niet van omdat het geen "c++" is....
Het zelfde effect kan je natuurlijk ook bereiken door gewoon .open() van ifstream te gebruiken... heb je ook geen try-catch nodig...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 18 februari 2002 11:07 schreef BDX het volgende:
Hallo,

Bij het openen van een file in een console applicatie wil ik checken of de file wel bestaat. De filename wordt als parameter meegegeven tijdens het executen.
Ik dacht dit te doen met try en catch maar het wil niet echt lukken. Weten jullie wat ik fout doe ?

Dit is de code (_argv[1] is de eerste parameter die wordt meegegeven.) :

const char * filename = _argv[1];
try{
ifstream file (filename, ios::in|ios::binary|ios::ate);
throw 1;
}
catch(int a)
{
cout << "File error!" << endl;
}


Groet,
Raymond
wat gaat er precies fout dan?
een ifstream throwt geen exception als de file niet bestaat, maar zet een status flag die je uit kunt lezen met rdstate () (retourneert failbit als de file niet bestaat). Of je kunt met is_open () testen of ie wel geopend is

Ter illustratie, de constructor van ifstream roept ook open () aan, dus het maakt niets uit of je dat nou zelf doet of via een constructor :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • JungleJim
  • Registratie: December 2000
  • Laatst online: 22:18
Op maandag 18 februari 2002 11:07 schreef BDX het volgende:
Hallo,

Bij het openen van een file in een console applicatie wil ik checken of de file wel bestaat. De filename wordt als parameter meegegeven tijdens het executen.
Ik dacht dit te doen met try en catch maar het wil niet echt lukken. Weten jullie wat ik fout doe ?

Dit is de code (_argv[1] is de eerste parameter die wordt meegegeven.) :

const char * filename = _argv[1];
try{
ifstream file (filename, ios::in|ios::binary|ios::ate);
throw 1;
}
catch(int a)
{
cout << "File error!" << endl;
}
De constructor van ifstream gooit geen exceptie als openen van het bestand niet lukt. Je kunt de is_open operatie gebruiken om te controleren of openen gelukt is:
code:
1
2
3
4
  ifstream file(_argv[1], ios::in|ios::binary|ios::ate);
  if (!file.is_open()) {
    cout << "File error!" << endl;
  }

Ter info (misschien overbodig, maar toch...), omdat je het bestand in binary mode hebt geopend, kun je niet de << en >> extract en insert operators gebruiken. Die werken namelijk alleen bij text in- en output.

Verwijderd

Hier een werkende oplossing: (je moet wel de status van de fstream checken voor je een exception throwed)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {
  try {
    if(argc < 2) throw 1;
    ifstream file(argv[1]);
    if(!file) throw 2;
    file.close();
  }
  catch(int v) {
    cerr << "I/O error# " << v << endl;
    return v;
  }
  cout << "Ok." << endl;
  return 0;
}

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
ALs je een exception wil van een stream, moet je
aangeven voor wat voor failures.
Openen is een zgn. badbit failure, dus je
moet fstream::exceptions(badbit) aanroepen
( of .exceptions( badbit | failbit ) )

Als je vervolgens fstream::open( filename )
doet en dat faalt, dan krijg je een standaard
exception.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Allemaal bedankt voor de hulp! het moet nu wel lukken met al deze mogelijkheden!

Thanks,

Raymond

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 18 februari 2002 15:16 schreef MSalters het volgende:
ALs je een exception wil van een stream, moet je
aangeven voor wat voor failures.
Openen is een zgn. badbit failure, dus je
moet fstream::exceptions(badbit) aanroepen
( of .exceptions( badbit | failbit ) )

Als je vervolgens fstream::open( filename )
doet en dat faalt, dan krijg je een standaard
exception.
correctie, bij openen wordt de failbit geset als ie niet geopend kan worden :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:21
Op maandag 18 februari 2002 11:26 schreef vicz het volgende:

[..]

Nou sommige mensen houden hier niet van omdat het geen "c++" is....
Het zelfde effect kan je natuurlijk ook bereiken door gewoon .open() van ifstream te gebruiken... heb je ook geen try-catch nodig...
Maar het werkt toch goed :? Ik doe het tenminste nog altijd zo :)

Verwijderd

Op maandag 18 februari 2002 19:28 schreef Marcj het volgende:

[..]

Maar het werkt toch goed :? Ik doe het tenminste nog altijd zo :)
Tja... van mij mag je hoor... ik heb er niks op tegen...
Pagina: 1