Edit report at https://bugs.php.net/bug.php?id=32100&edit=1

 ID:                 32100
 Comment by:         viktor at zuiderkwast dot se
 Reported by:        ceefour at gauldong dot net
 Summary:            Request 'finally' support for exceptions
 Status:             Closed
 Type:               Feature/Change Request
 Package:            Feature/Change Request
 Operating System:   *
 PHP Version:        5.*
 Block user comment: N
 Private report:     N

 New Comment:

The same problem exists in C++, which also lacks the finally clause. The 
standard way to solve the resource allocation problem in C++ is instead by 
using the RAII design pattern.

As noted in Wikipedia on RAII, "In this language, the only code that can be 
guaranteed to be executed after an exception is thrown are the destructors of 
objects residing on the stack.". The same is valid for PHP (although the 
objects are reference-counted instead of being allocated on the stack). The 
destructor is guarranteed to be called as soon as all references to the object 
run out of scope, so the RAII is effectively usable in PHP.

So, the code you would put in the finally clause in Java etc has to be put in a 
destructor of some object instead. Then, when a return or a or an uncatched 
exception occurs inside a try block, and there are no other references to the 
object, the destructor will be called at this point to free the resources.

In my optinion, the finally clause is a more elegant solution, although it 
might be *too sophisticated* for PHP...


Previous Comments:
------------------------------------------------------------------------
[2011-07-25 03:27:14] ninzya at inbox dot lv

++finally

------------------------------------------------------------------------
[2011-07-22 07:53:27] dsberliner at gmail dot com

++ for finally in exception handling. Please reconsider.

------------------------------------------------------------------------
[2011-05-30 02:53:58] bat at flurf dot net

Here's an idea! Find all the people who think "finally" isn't needed in PHP.  
Invite them to go back to programming Visual Basic, because they're ignorant.  
The rest can work on implementing it.  Easy!

------------------------------------------------------------------------
[2011-05-05 11:52:26] ealexs at gmail dot com

PHP++ for finally in PHP ;)

my code:

disableSIPTrunk (10 lines of code)

try
{
    // do some stuff 
}
finally 
{
    enableSIPTrunk (10 lines of code)
}

// saves duplicate code and it's very elegant !

------------------------------------------------------------------------
[2011-04-05 21:16:06] adam dot pippin at ohmedia dot ca

---
Disable user permission checking
try
{
   Call a half a dozen methods
}
finally
{
   Re-enable user permission checking
}
---

The ten year old discussion I found on the issue 
(http://marc.info/?l=php-internals&m=96774165717219&w=3) doesn't seem terribly 
applicable to my case. Specifically, it suggests:

---
try {
         ... modify contents ...
} catch {
         ... any error recovery code here ...
}
... cleanup code ...
---

Except my code doesn't 'recover' from errors. It runs back up the call stack 
and reports the error to the user. I have absolutely zero use for a catch here. 
My workaround (which, unlike a basic rethrow preserves the line/file):

---
Disable permission checking
try
{
   Run methods
}
catch (Exception $e)
{
   Enable permission checking
   throw new Exception($e->getMessage(), $e->getCode(), $e);
}
Enable permission checking
---

The workaround simply requires a few extra lines of code and a bunch of 
duplicated code. But hey, finally isn't required, so it's all good.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=32100


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=32100&edit=1

Reply via email to