|
|
Hakan D wrote: Reset?... Is this a session like the others?
Indeed I can see some improvements after second hard-reset.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
I doubt it. It seems the cheese has finally slipped off his cracker.
|
|
|
|
|
|
I said that to CPallini.
modified on Friday, January 25, 2008 9:08:49 AM
|
|
|
|
|
toxcct wrote: i
Should be I .
toxcct wrote: i said that to CPalinni.
Should be CPallini , your typing is worsening... Uhm, maybe the Turkish illness is contagious!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
|
Hello everyone,
When change from __try to try, and __except(GetExceptionCode()) to catch(...), compile can pass.
Compile error and code are,
Compiling...
main.cpp
d:\visual studio 2008\projects\test_exception1\test_exception1\main.cpp(30) : warning C4509: nonstandard extension used: 'main' uses SEH and 'foo1' has destructor
d:\visual studio 2008\projects\test_exception1\test_exception1\main.cpp(28) : see declaration of 'foo1'
d:\visual studio 2008\projects\test_exception1\test_exception1\main.cpp(35) : error C2712: Cannot use __try in functions that require object unwinding
#include <iostream>
#include <excpt.h>
#include <windows.h>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "constructing Foo" << endl;
}
virtual ~Foo()
{
cout << "destrucing Foo" << endl;
}
};
int main()
{
int* address = NULL;
__try{
Foo foo1;
(*address) = 1024;
} __except (GetExceptionCode())
{
cout << "access violation caught" << endl;
}
return 0;
}
</windows.h></excpt.h></iostream>
regards,
George
|
|
|
|
|
Cannot use __try in functions that require object unwinding :
the above error means the usage of __try/__except is forbidden in the function which has objects which (the object) will be destroyed upon the function return.
Come online at:-
jubinc@skype
|
|
|
|
|
Thanks Don Box,
1.
Why using try/catch is ok? It is still structured exception.
2.
Why the usage of __try/__except is forbidden in the function which has objects which (the object) will be destroyed upon the function return? I think the more accurate term to replace return is stack unwinding.
regards,
George
|
|
|
|
|
Is it as simple as moving Foo foo1 outside of the try catch block?
Iain.
|
|
|
|
|
Moving out Foo foo1 will result in the same compile error, my purpose of this post is to find the root cause of compiler error, i.e. at which point I violate the C++ standard.
Any ideas, Iain?
regards,
George
|
|
|
|
|
Sorry, I'm not much of an expert on exceptions etc. A weak point in my armoury. I'm old school, and check return values, instead of putting up a blast shield for when things blow up.
I probably *should* do both...
Iain.
|
|
|
|
|
Thanks all the same, Iain!
It is welcome if you could share some points in the future.
regards,
George
|
|
|
|
|
George_George wrote: at which point I violate the C++ standard
At the point of using MS-specific SEH.
Let's think the unthinkable, let's do the undoable, let's prepare to grapple with the ineffable itself, and see if we may not eff it after all. Douglas Adams, "Dirk Gently's Holistic Detective Agency"
|
|
|
|
|
|
Which means that the Standard C++ Exception model is more convenient!
Maxwell Chen
|
|
|
|
|
I agree Maxwell!
But could we come back to the original question please? Suppose we have to maintain some code using structured exception.
Why __try/__except does not work but try/catch work with structured exception?
regards,
George
|
|
|
|
|
MSDN said that:
<br />
You should not use structured exception handling in functions that use objects with destructors. If an exception occurs, the destructor cannot be called. Use C++ exception handling instead.
I have never used SEH, c++'s exception handling is more powerful, I think
A Chinese VC++ programmer
|
|
|
|
|
No zengkun100,
The destructor could be invoked even if it is structured exception, if you change my code from __try to try, and change __except to catch.
Here is the output,
constructing Foo
destructing Foo
access violation caught
You can see if we change the keyword, structured exception is caught and destructor is called before handler.
Not as you quoted -- "If an exception occurs, the destructor cannot be called.".
regards,
George
|
|
|
|
|
George_George, the answer is very clear now.
Different keyword, different exception handling method.
Use C++ exception handling whenever possible
A Chinese VC++ programmer
|
|
|
|
|
Any rule in C++ mentioned we can not use object with destructor in __try block with /EHa compile option? I can not find. So, I do not agree.
regards,
George
|
|
|
|
|
George_George wrote: So, I do not agree.
You are getting stubborn.
George_George wrote: Any rule in C++ mentioned we can not use object with destructor in __try block with /EHa compile option?
The C++-Standard is not about MS-specific compiler internal like /EHa or __try
Which with its two leading underscores clearly says "I am vendor-specific".
Fact is, that you can tell the compiler to use C++ exceptions and you can tell the compiler to use the Standard-predating SEH.
Let's think the unthinkable, let's do the undoable, let's prepare to grapple with the ineffable itself, and see if we may not eff it after all. Douglas Adams, "Dirk Gently's Holistic Detective Agency"
|
|
|
|
|
|
George_George wrote: Please read to get my analysis,
We are not here to do your work, George. Most of us have jobs, so we help here when we can, not every time you find something that you disagree with. A little due diligence on your part will go a long way.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|