c++ - How to catch runtime errors of the C++ standard library with DigitalMars
- Rolf Hemmerling <hemmerling gmx.net> Jan 21 2004
- Scott Michel <scottm cs.ucla.edu> Jan 21 2004
- Rolf Hemmerling <hemmerling gmx.net> Jan 21 2004
- Jan Knepper <jan smartsoft.us> Jan 21 2004
- Scott Michel <scottm cs.ucla.edu> Jan 21 2004
- Rolf Hemmerling <hemmerling gmx.net> Jan 22 2004
- Rolf Hemmerling <hemmerling gmx.net> Jan 22 2004
- Rolf Hemmerling <hemmerling gmx.net> Jan 22 2004
- Jan Knepper <jan smartsoft.us> Jan 22 2004
- Rolf Hemmerling <hemmerling gmx.net> Jan 22 2004
- Jan Knepper <jan smartsoft.us> Jan 22 2004
- Rolf Hemmerling <hemmerling gmx.net> Jan 23 2004
- Scott Michel <scottm cs.ucla.edu> Jan 22 2004
- "Walter" <walter digitalmars.com> Jan 26 2004
Hello !
How to catch runtime errors with DigitalMars C++ ?
There is no
#include <stdexcept>
and nothing similar, but just
#include <eh.h>
The problem is
"Error: undefined identifier 'runtime_error' catch( runtime_error e)"
So the exceptions usually defined in <stdexcept> are not defined for
this compiler at all ?!
Is this a lack of feature ? Any workaround to work with standard runtime
exceptions ?
See this german example,
if you allocate "1000" MBytes, the runtime error should be catched, by
standard exceptions.
Of course I MIGHT throw a user-defined exception.
But if there are no system exceptions with DMC, means that I cannot use
portable code for other compilers which depend on this feature ! So I
must know for my own development.
Btw, some other C++ exception features like
set_terminate()
and
set_unexpected()
are just defined in
#include <eh.h>
, not in
#include <exception>
:-(
Any reason for that ?
Sincerely
Rolf
// 6. Beispiel Fehlerbehandlung / Exceptionhandling
// - vorgegebene Exceptions aus der C++-Standardbibliothek
// definiert in <stdexept>
// Klassenhierarchie:
// exception <--- bad_cast
// bad_alloc
// bad_exception
// bad_typeid <--- __non_rtti_object
// logic_error <--- domain_error
// invalid_argument
// length_error
// out_of_range
// runtime_error <---- overflow_error
// range_error
// underflow_error
#include <iostream>
#include <stdexcept>
using namespace std;
int main()
{
char *buffer;
int mb;
// Zu überwachender Block
try
{
cout << "Wieviel MB soll reserviert werden? ";
cin >> mb;
buffer = new char[1024*1024*mb];
if (buffer==NULL)
throw runtime_error("Geht nicht");
cout << "Programm läuft weiter ..." << endl;
}
// Fehlerbehandlungsroutinen
catch(runtimeerror e)
{
cout << "Exception: " << e.what() << endl;
return 1;
}
cout << "Programm fehlerfrei beendet." << endl;
return 0;
}
--
/ / / Alone on the data highway...
/ / like on an allee in Hannover-Herrenhausen
/ / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany
/ / / http://www.hemmerling.com/
Jan 21 2004
Most of DMC++'s "Standard C++ compliance" comes from the STLport package. If you add "-I\dm\stlport\stlport" to your compile command line, your problems should be solved. Note: change "\dm" to the top directory where you installed DMC. -scooter Rolf Hemmerling wrote:Hello ! How to catch runtime errors with DigitalMars C++ ? There is no #include <stdexcept> and nothing similar, but just #include <eh.h> The problem is "Error: undefined identifier 'runtime_error' catch( runtime_error e)" So the exceptions usually defined in <stdexcept> are not defined for this compiler at all ?! Is this a lack of feature ? Any workaround to work with standard runtime exceptions ? See this german example, if you allocate "1000" MBytes, the runtime error should be catched, by standard exceptions. Of course I MIGHT throw a user-defined exception. But if there are no system exceptions with DMC, means that I cannot use portable code for other compilers which depend on this feature ! So I must know for my own development. Btw, some other C++ exception features like set_terminate() and set_unexpected() are just defined in #include <eh.h> , not in #include <exception> :-( Any reason for that ? Sincerely Rolf // 6. Beispiel Fehlerbehandlung / Exceptionhandling // - vorgegebene Exceptions aus der C++-Standardbibliothek // definiert in <stdexept> // Klassenhierarchie: // exception <--- bad_cast // bad_alloc // bad_exception // bad_typeid <--- __non_rtti_object // logic_error <--- domain_error // invalid_argument // length_error // out_of_range // runtime_error <---- overflow_error // range_error // underflow_error #include <iostream> #include <stdexcept> using namespace std; int main() { char *buffer; int mb; // Zu überwachender Block try { cout << "Wieviel MB soll reserviert werden? "; cin >> mb; buffer = new char[1024*1024*mb]; if (buffer==NULL) throw runtime_error("Geht nicht"); cout << "Programm läuft weiter ..." << endl; } // Fehlerbehandlungsroutinen catch(runtimeerror e) { cout << "Exception: " << e.what() << endl; return 1; } cout << "Programm fehlerfrei beendet." << endl; return 0; }
Jan 21 2004
Hello !
This missing feature is a feature of the standard library!
So the STL **Template** library does not help.
I just found out that other "old" compilers lack of the feature, too.,
like "Microsoft VC++ 4.0" ( which has basic support for exceptions, in
opposite yet older 16-bit versions ).
In opposite, OpenWatcom and BCC 5.5 support the feature.
Any other suggestions ?
Sincerely
Rolf
--
/ / / Alone on the data highway...
/ / like on an allee in Hannover-Herrenhausen
/ / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany
/ / / http://www.hemmerling.com/
Jan 21 2004
Rolf Hemmerling wrote:Hello ! This missing feature is a feature of the standard library! So the STL **Template** library does not help.
I think STLport is quite a bit more than just STL.. www.stlport.org -- ManiaC++ Jan Knepper But as for me and my household, we shall use Mozilla... www.mozilla.org
Jan 21 2004
Rolf Hemmerling wrote:Hello ! This missing feature is a feature of the standard library! So the STL **Template** library does not help.
The STLport is a ***LOT*** more than just STL templates. The STLport library has a lot of "extra" headers that help the compiler environment conform to standard C++. The current DMC++ design relies on STLport to provide this additional layer of conformity, rather than reinvent the compiler's header files to achieve conformity. I could be wrong, but that's my impression based on compiling my code that relies on standard C++ iostream. -scooter
Jan 21 2004
Hello !
I found out
"set_terminate()"
is mentioned in the file
dm/stlport/stlport/exception
and "runtime_error"
is mentioned in the file
(installpath)dm/stlport/stlport/stdexecpt
but if I try to compile with "(installpath)dm\stlport\stlport",
I still get the error messages that the compiler does not find
"set_terminate()" and "runtime_error" !
Any suggestions ?
Sincerely
Rolf
--
/ / / Alone on the data highway...
/ / like on an allee in Hannover-Herrenhausen
/ / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany
/ / / http://www.hemmerling.com/
Jan 22 2004
Hello !
I wanted to say, that including
#include <stdexcept>
#include <exception>
did not help, although these are "the" exception header files for
STLport !! :-(.
Sincerely
Rolf
--
/ / / Alone on the data highway...
/ / like on an allee in Hannover-Herrenhausen
/ / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany
/ / / http://www.hemmerling.com/
Jan 22 2004
MOre clearly:
I used the example from the tread start and added
#include <stdexcept>
#include <exception>
in the file,
while I put the directory of STLPORT at the first position of the
include path string, and the compiler even did not find
set_terminate()
runtime_error
:-(
So what's wrong with me ?
Must I use special namespaces for use with STL ??
Please help, if you can!
I am a newbie to C++, btw ( but with some C and some Java experience ).
Sincerely
Rolf
--
/ / / Alone on the data highway...
/ / like on an allee in Hannover-Herrenhausen
/ / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany
/ / / http://www.hemmerling.com/
Jan 22 2004
Can you post the message? I wonder whether it is the compiler or the linker that can not find the stuff you mention. Rolf Hemmerling wrote:MOre clearly: I used the example from the tread start and added #include <stdexcept> #include <exception> in the file, while I put the directory of STLPORT at the first position of the include path string, and the compiler even did not find set_terminate() runtime_error :-( So what's wrong with me ? Must I use special namespaces for use with STL ?? Please help, if you can! I am a newbie to C++, btw ( but with some C and some Java experience ). Sincerely Rolf
-- ManiaC++ Jan Knepper But as for me and my household, we shall use Mozilla... www.mozilla.org
Jan 22 2004
Hello !
At first, my starting-C++ project is a multi-compiler project.
So with the "same" very-complicated makefile and a common header file,
I succeeded with OTHER compilers to include those header files which
contain the definitions for "set_terminate()" and "runtime_errror".
For example, with OpenWatcom, this
*****
class _WPRTLINK runtime_error : public exception {
public:
runtime_error( string const& what_arg ) _WCTHROWS(())
: exception( what_arg ) {
}
};
****
defines the "runtime_error" in the proper header files,
which I did not find with MingW, MS VC++4.0 and DMC !
So if I include
#include <stdexcept>
#include <exception>
, these files ARE found by the compiler, nethertheless they don´t
contain the proper information to support "set_terminate()" and
"runtime_error" ( as I said, this is **standard library stuff", as the
actions of the standard libarary operations are controlled by try..catch
with "runtime_error" ect.
here are the error messages:
*********************
set_terminate( exitus );
^
..\..\src\data\exception\Exception.cpp(153) : Error: undefined
identifier 'set_terminate'
set_unexpected( wasIstLos );
^
..\..\src\data\exception\Exception.cpp(217) : Error: undefined
identifier 'set_unexpected'
throw runtime_error ("Geht nicht");
*********************
So if I setup the right include path, the include files are found, but
are not sufficent.
So I think that the STLlib does NOT help with "set_terminate()" and
"runtime_error" :-(.
Support for "set_terminate()" is by
#include <eh.h>
of the standard non-STL include files,
, but there is no support for "runtime_error" ? :-(.
Any suggestions ?
Sincerely
Rolf
--
/ / / Alone on the data highway...
/ / like on an allee in Hannover-Herrenhausen
/ / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany
/ / / http://www.hemmerling.com/
Jan 22 2004
Rolf Hemmerling wrote:set_terminate( exitus ); ^ ...\..\src\data\exception\Exception.cpp(153) : Error: undefined identifier 'set_terminate' set_unexpected( wasIstLos ); ^ ...\..\src\data\exception\Exception.cpp(217) : Error: undefined identifier 'set_unexpected'
Both are defined in eh.h as it seems... I just hope they exist in the library. So, indeed for these you would have to include eh.hthrow runtime_error ("Geht nicht"); *********************
runtime_error is not defined anywhere as far as I can tell. Including stlport indeed probably will not help you a lot. For the time being you could implement a class runtime_error yourself...So if I setup the right include path, the include files are found, but are not sufficent. So I think that the STLlib does NOT help with "set_terminate()" and "runtime_error" :-(. Support for "set_terminate()" is by #include <eh.h> of the standard non-STL include files, , but there is no support for "runtime_error" ? :-(. Any suggestions ? Sincerely Rolf
-- ManiaC++ Jan Knepper But as for me and my household, we shall use Mozilla... www.mozilla.org
Jan 22 2004
Hello ! Jan Knepper wrote:throw runtime_error ("Geht nicht"); *********************
Including stlport indeed probably will not help you a lot. For the time being you could implement a class runtime_error yourself...
exception <--- bad_cast // bad_alloc // bad_exception // bad_typeid <--- __non_rtti_object // logic_error <--- domain_error // invalid_argument // length_error // out_of_range // runtime_error <---- overflow_error // range_error // underflow_error are all not available with oldfashioned MS VC++ 4.0 and with DMC, and this makes ( the standard library of ) DMC "oldfashioned". And so even though I am just a beginner with C++, does not give arguments to support DMC with my projects. Or, vice-versa, I must avoid "standard" c++ features with my project, to support DMC. As self-written exceptions are supported, probably its a lack of the system library of the compiler ? Any other suggestions ? Sincerely Rolf -- / / / Alone on the data highway... / / like on an allee in Hannover-Herrenhausen / / / The Hemmerling (R) WEB site - Rolf Hemmerling,Germany / / / http://www.hemmerling.com/
Jan 23 2004
Rolf Hemmerling wrote:Hello ! At first, my starting-C++ project is a multi-compiler project. So with the "same" very-complicated makefile and a common header file, I succeeded with OTHER compilers to include those header files which contain the definitions for "set_terminate()" and "runtime_errror". For example, with OpenWatcom, this ***** class _WPRTLINK runtime_error : public exception { public: runtime_error( string const& what_arg ) _WCTHROWS(()) : exception( what_arg ) { } }; **** defines the "runtime_error" in the proper header files, which I did not find with MingW, MS VC++4.0 and DMC ! So if I include #include <stdexcept> #include <exception> , these files ARE found by the compiler, nethertheless they don´t contain the proper information to support "set_terminate()" and "runtime_error" ( as I said, this is **standard library stuff", as the actions of the standard libarary operations are controlled by try..catch with "runtime_error" ect. here are the error messages: ********************* set_terminate( exitus ); ^ ..\..\src\data\exception\Exception.cpp(153) : Error: undefined identifier 'set_terminate' set_unexpected( wasIstLos ); ^ ..\..\src\data\exception\Exception.cpp(217) : Error: undefined identifier 'set_unexpected' throw runtime_error ("Geht nicht"); ********************* So if I setup the right include path, the include files are found, but are not sufficent. So I think that the STLlib does NOT help with "set_terminate()" and "runtime_error" :-(.
1. Make sure your IDDE include path is set as follows: \dm\stlport\stlport;\dm\include;\dm\include\win32 or the includes to the command line version look like: -I\dm\stlport\stlport -I\dm\include -I\dm\include\win32 2. It's "std::set_terminate", not "set_terminate". Likewise, it's "std::set_unexpected". 3. There does seem to be a bug in the DMC runtime library, because set_unexpected and std::set_unexpected are both undefined. Work around this problem as follows: #if !defined(__SC__) && !defined(__DMC__) set_unexpected(wasIstLos); #endif Welcome to the wonderful world of porting code! -scooter
Jan 22 2004
"Rolf Hemmerling" <hemmerling gmx.net> wrote in message news:bulkfe$501$1 digitaldaemon.com...Hello ! How to catch runtime errors with DigitalMars C++ ?
What's happening is the global new operator is not throwing an exception when it fails to allocate the memory, it returns NULL instead. This is a bug in the runtime library.
Jan 26 2004









Jan Knepper <jan smartsoft.us> 