I was just reading through some old articles in the 'Why not develop new
language' thread and came across the finally debate.
Everytime I mention 'finally' to C++ programmers I get almost emotional
responses about why it is not needed in C++. I don't get that.
For example, consider the following code. Please note, I can only use
heap allocated objects in my current project (new/delete).
//
// Foo - Tries to foo. Can throw a FooException
//
void Foo()
{
try {
// Do your foo business that could throw a FooException
}
catch (...) {
// Cleanup your business
throw;
}
// Cleanup your business
}
Now, with finally I could do this:
void Foo()
{
try {
// Do your foo business that could throw a FooException
}
finally {
// Cleanup your business
}
}
Which I find *much* cleaner than the other example as there is no
need to do the cleanup twice.
Anyway, the debate is useless because we don't have finally. So my question
really is, how do people refactor the above to something nicer?
S.
Jul 22 '05
54 2907
> In my situation: no templates, no STL, no external libraries. Just bare C++. GCC extensions are acceptable (3.3).
Beeeeeep!
No templates but bare C++? That's like "a tree, but without a trunk,
twigs and leaves". Only the bugs remain...
* Stefan Arentz: al***@start.no (Alf P. Steinbach) writes:
...
Mayby someone cann tell me why this was not taken into C++
Because 'finally' is rarely needed in C++, and where it is needed it indicates a redesign/refactoring is called for, and in the extremely rare cases where that isn't an option, you can easily emulate it.
So how do you emulate it.
One way: you exit the inner block by throwing an exception so that all exits
are via exceptions. In the common catch handler you clean up (this is the
'finally' part) and then check whether the exception corresponds to a normal
return. If so, you do a normal return, otherwise you rethrow. I think this
should perhaps be tought in programming classes because it makes the cost of
'finally', what goes on behind the scenes, very explicit. On the other hand
there is the risk that what students know about they will use...
Another way: you pass references to things to be cleaned up to an object of a
locally declared class where the destructor implements the 'finally'.
But generally, use smart-pointers, RAII and exception-transparent code to
avoid the need for 'finally' handling: whenever you find yourself thinking
that 'finally' would be nice here, think about how much nicer if 'finally'
weren't needed here at all, i.e. if the code was refactored/redesigned! :o)
PS: No need to use gcc extension to define an inner function; where you
need it you can use a local class.
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Nicolas Pavlidis wrote: "John Harrison" <jo************ *@hotmail.com> writes:
Simple use a class with a destructor (it's because Java doesn't have destructors that it needs finally)
void Foo() { FooBusiness biz; // Do your foo business that could throw a FooException }
The FooBusiness destructor does the cleanup. This way you do not even need a try/catch but what's about this:
void bar() { char * my_ptr; try { SomeObject instace; my_ptr = new char[987]; // do something instace.doSomeh ting() // throws an exception let's say MyExec // work with pointer delete my_ptr } catch(MyExec &exc) { delete my_ptr; // error handling } }
Here it's necessary to duplicate code, another example would be file handling.
That's what std::auto_ptr is for:
void bar()
{
try
{
SomeObject instace;
std::auto_ptr<c har> my_ptr(new char[987]);
// do something
instace.doSomeh ting() // throws an exception let's say MyExec
}
catch(MyExec &exc)
{
// error handling
}
}
See? You don't need to cleanup twice. You actually don't need to cleanup at
all. The destructor does the work for you, and that's how it's supposed to
be in C++.
Sometimes a finally - block can help.
It rather looks to me like a workaround for a design problem. In most cases,
you shouldn't need to deal with raw memory (and for those, you have
auto_ptr). In any other cases, the objects should do the cleanup themselves
on destruction. This is btw. a big advantage over GC languages that lack a
destructor (or at least lack one which is called at points that are exactly
defined)
Mayby someone cann tell me why this was not taken into C++
Probably nobody saw a need for it.
> > The FooBusiness destructor does the cleanup. This way you do not even
need a try/catch
I don't buy this for two reasons.
Wrapper classes introduce more code. I would like to use less code. I also think it is a workaround and not a structural solution.
Cleanup code are not part of the program logic, so it is very nice to avoid
it in the middle of the main code by putting it away in a destructor.
In addition the destructor approach prevents programmers from forgetting
cleanup code which leads to more stable applications.
So it is not a workaround but a significant improvement.
Niels Dybdahl
Tom Widmer <to********@hot mail.com> writes: On 21 Sep 2004 14:32:39 +0200, Stefan Arentz <st***********@ gmail.com> wrote:
I was just reading through some old articles in the 'Why not develop new language' thread and came across the finally debate.
Everytime I mention 'finally' to C++ programmers I get almost emotional responses about why it is not needed in C++. I don't get that.
For example, consider the following code. Please note, I can only use heap allocated objects in my current project (new/delete).
So your current project isn't in standard C++, but rather a company/personal dialect? I'm not sure we can help much with that...
Well, it is code for firmware of a small device. Not very small, but small
enough that something like STL or Boost is not an option. Templates probably
are, but I've had no reason to use them yet and I would have to look into
object code size first.
Btw, I am very happy with the choise of C++ for this project. It has made
the code more robust and organized.
.... Anyway, the debate is useless because we don't have finally. So my question really is, how do people refactor the above to something nicer?
void Foo() { //Do your foo business that could throw a FooException }
where the foo business uses stack based objects whose destructors do the cleanup. If your company doesn't allow that, then your company is using mackled C++, and might be better off with C# or Java. At the very least you can use std::auto_ptr.
So that would mean stack based objects and references? Get rid of all
pointers? It would probably mean a complete redesign of some things,
but I am willing to look into it. Is this the RAII stuff other people
were talking about?
S.
Stefan Arentz wrote: al***@start.no (Alf P. Steinbach) writes:
...
> Mayby someone cann tell me why this was not taken into C++
Because 'finally' is rarely needed in C++, and where it is needed it indicates a redesign/refactoring is called for, and in the extremely rare cases where that isn't an option, you can easily emulate it.
So how do you emulate it.
In my situation: no templates, no STL, no external libraries. Just bare C++. GCC extensions are acceptable (3.3).
I've used inner functions (GCC extension) at one point.
void Foo() { vars;
void cleanup() { cleanup vars; }
try { }
catch (...) { cleanup(); throw; }
cleanup(); }
But still, very yuckie :)
Why don't the destructors of your "vars" do the cleanup? Anyway, you can
still use RAII:
void Foo()
{
struct whatever
{
// your variables
~whatever()
{
// cleanup
}
} vars;
// something that throws - or not.
}
No try, no catch, no finally needed. I admit that finally would be slightly
more convenient, but in my experience the cases where something like that
is needed are rare.
"Gernot Frisch" <Me@Privacy.net > writes: I'm on a device that is too small to even include STL :)
If you design your classes with nice d'tors and only use classes instead of new/malloc allocations, the problem is void. If you seem to have a small device (WTF is this - a fridge?), then write optimized code. The 'final' keyword would not do anything else than wrap your code in a gargabe collector, which _is_ available as template classes for those who cannot remember what they allocate. ;) A good compiler will produce smal code from a template library, though the source code might be big. And don't tell me you're compiling the program _on_ the fride.
Neh, we keep the beer in the fridge. The device is a MIPS based device
with not too much RAM/Flash. Think <= 8MB. which needs to be shared
with a kernel, libraries some tools.
It is not very special, you just can't use all nice tricks that are
obvious on a normal 1GB workstation with a standard 80GB drive :)
S.
"Stefan Arentz" <st***********@ gmail.com> wrote in message
news:87******** ****@keizer.soz e.com... Tom Widmer <to********@hot mail.com> writes:
On 21 Sep 2004 14:32:39 +0200, Stefan Arentz <st***********@ gmail.com> wrote:
I was just reading through some old articles in the 'Why not develop
newlanguage' thread and came across the finally debate.
Everytime I mention 'finally' to C++ programmers I get almost emotional responses about why it is not needed in C++. I don't get that.
For example, consider the following code. Please note, I can only use heap allocated objects in my current project (new/delete).
So your current project isn't in standard C++, but rather a company/personal dialect? I'm not sure we can help much with that...
Well, it is code for firmware of a small device. Not very small, but small enough that something like STL or Boost is not an option. Templates
probably
Is this because your compiler doesn't support STL/Boost? Or that you "think"
STL\Boost will require more memory?
Jeff F
"Stefan Arentz" <st***********@ gmail.com> skrev i en meddelelse
news:87******** ****@keizer.soz e.com... "Peter Koch Larsen" <pk*****@mailme .dk> writes:
"Stefan Arentz" <st***********@ gmail.com> skrev i en meddelelse news:87******** ****@keizer.soz e.com... [snip] Which I find *much* cleaner than the other example as there is no need to do the cleanup twice.
Anyway, the debate is useless because we don't have finally. So my question really is, how do people refactor the above to something nicer?
S.
Hi Stefan
John Harrison has already answered your question. I just want to add
that you could check out boost for some of the smart pointers there. There is also "scopeguard " for more special stuff.
I'm on a device that is too small to even include STL :)
S.
I do not understand what you're saying. STL - or templates - does not
necessarily use more ressources than handwritten code. In your case it
should be safe.
/Peter
"Stefan Arentz" <st***********@ gmail.com> skrev i en meddelelse
news:87******** ****@keizer.soz e.com... "Gernot Frisch" <Me@Privacy.net > writes:
I'm on a device that is too small to even include STL :)
If you design your classes with nice d'tors and only use classes instead of new/malloc allocations, the problem is void. If you seem to have a small device (WTF is this - a fridge?), then write optimized code. The 'final' keyword would not do anything else than wrap your code in a gargabe collector, which _is_ available as template classes for those who cannot remember what they allocate. ;) A good compiler will produce smal code from a template library, though the source code might be big. And don't tell me you're compiling the program _on_ the fride.
Neh, we keep the beer in the fridge. The device is a MIPS based device with not too much RAM/Flash. Think <= 8MB. which needs to be shared with a kernel, libraries some tools.
It is not very special, you just can't use all nice tricks that are obvious on a normal 1GB workstation with a standard 80GB drive :)
S.
Ahhh... that is lots and lots of space for C++.
/Peter This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: melledge |
last post by:
Worldwide Debate on Open Data Highlighted at XTech 2005
Presentation Topics Include Web Services, RSS, FOAF, OAI, Open Access,
and More;Special Focus on OpenOffice.org's Influence on Standards and
New Technologies
Alexandria, Va. - April 20, 2005 - The opportunities and challenges
of "open data" on the Web will be the focus of a new educational
track at XTech 2005, the premier European conference for developers and
managers working with...
|
by: VB Programmer |
last post by:
Variable scope doesn't make sense to me when it comes to Try Catch Finally.
Example: In order to close/dispose a db connection you have to dim the
connection outside of the Try Catch Finally block. But, I prefer to dim them
"on the fly" only if needed (save as much resources as possible). A little
further... I may wish to create a sqlcommand and datareader object ONLY if
certain conditions are met. But, if I want to clean these up in the...
|
by: berns |
last post by:
Hi All,
A coworker and I have been debating the 'correct' expectation of
evaluation for the phrase a = b = c. Two different versions of GCC
ended up compiling this as b = c; a = b and the other ended up
compiling it as a = c; b = c. (Both with no optimizations enabled).
How did we notice you may ask? Well, in our case 'b' was a memory
mapped register that only has a select number of writable bits. He
claims it has been a 'C...
|
by: Wells |
last post by:
Debate Simmering in US Over Regulation of Internet
A heated debate is shaping up in Washington about a concept some
activists are calling Internet network neutrality, known more popularly
as net neutrality. At issue are calls for the U.S. government to
regulate the Internet, and, in effect, opponents say, determine which
companies get bigger shares of the profits.
To read the full text, please go to:...
|
by: John A Grandy |
last post by:
I'm in a vigorous debate at my work regarding objects assuming knowledge of
the type their containing object.
This debate pertains specifically to ASP.NET, but I have decided to post in
the C# forum because this is where most of the OO gurus hang out, and I view
this as a fundamental issue of OO design.
In ASP.NET, objects of type WebForm and UserControl have an intrinsic Page
property which refers to their containing Page.
| |
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
| |
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |