Thanks Steve.  This is more the way I was taught years ago. But since I 
was new to PHP, I was not sure it this is new with these OOP.

What you describe makes a lot of sense to me.  Check for all the errors 
conditions that you can up front, and don't let users do things you 
don't want them to do, to maintain data integrity.  The throw is a 
graceful way of catchings things, that should not happen, rather that 
the user just getting a PHP error or a 500 page.

Thanks for helping me make sure I am following best practices.

Bill

On 5/30/2012 7:01 AM, Steve-2 [via CakePHP] wrote:
> Thanks for this thread actually Bill, it has given me a lot of pause 
> for thought...
>
> Exceptions are a method of reporting WHAT has gone wrong or is about 
> to go wrong. It is not a method of reporting WHERE it went wrong. In 
> my experience they are primarily used for detecting "This should not 
> happen" conditions. In your example the Category model delete function 
> should not be called unless that category is empty, so an exception 
> could be thrown if that condition is not met. This is a long way away 
> from just calling delete() and see if it works. Remember that an 
> exception can be thrown in beforeDelete(), delete(), afterDelete() in 
> your model, any parent model, or any related model that is affected in 
> HABTM, HasMany, ... relationships and they will all arrive at your 
> catch block. You could end up with code like...
>
> try {
>    $this->Category->delete( $id );
> } catch( NotEmptyCategoryException $nece ) {
>      ....
> } catch( CategoryHasChildCategoriesException $ccce ) {
>     ....
> } catch( CategoryReferencedInBlogTableException $crbe ) {
>     ....
> } catch( ChildCategoryOfThisCategoryNotEmptyException $damn ) {
>     ....
> }
>
> This logic, to my mind, would be far better positioned in the model 
> function...
>
> Category::isDeletable($id) {
>     $result = true;
>     if( $this->hasItems() ) {
>        $this->log( 'Cannot delete category containing items.', 'debug' );
>        $result = false;
>     }
>     if( $this->hasChildCategories() ) {
>         $this->log('Cannot delete category with child categories.', 
> 'debug' );
>         $result = false;
>     }
>     ...
>     return $result;
> }
>
> CategoriesController::delete( $id ) {
>     try {
>         if( $this->Category->isDeletable($id) ) {
>             $this->Category->delete($id);
>         }
>     }
>     catch( Exception $e ){
>         // If isDeletable has done it's job, this should never happen.
>         $this->log( $e->message(), 'error' );
>         ....
>     }
> }
>
> Not only is this cleaner, but the model is FAR easier to write test 
> cases for.
>
> Steve (Ratty)
>
>
>
>
> On 29/05/12 20:45, bs28723 wrote:
>> Thanks @stork & @steve-2  for the examples - great stuff!
>>
>> Can either of you, give me some best practices for exceptions 
>> processing?  Maybe it is my self-taught PHP & CakePHP experiences but 
>> I have not a done a lot with exceptions.  Is this efficient?  Any 
>> good references to do some reading on this?
>>
>> Thanks,
>> bill
>>
>>
>> On 5/29/2012 2:17 PM, Steve-2 [via CakePHP] wrote:
>>> On 29/05/12 15:35, stork wrote:
>>>
>>> > ...or even better:
>>> >
>>> > try {
>>> >     if ($this->Category->delete($id)) {
>>> >         $this->Session->setFlash('Category has been deleted');
>>> >         $this->redirect(array('action' => 'index'));
>>> >     } else {
>>> >         $this->Session->setFlash('Unknown error');
>>> >     }
>>> > } catch (NotEmptyCategoryException $e) {
>>> >     $this->Session->setFlash('This category is not empty');
>>> > }
>>> > $this->redirect($this->referer());
>>>
>>> ...or even better:
>>>
>>> if( $this->Category->isEmpty() ) {
>>>      if ($this->Category->delete($id)) {
>>>          $this->Session->setFlash('Category has been deleted');
>>>          $this->redirect(array('action' => 'index'));
>>>      } else {
>>>          $this->Session->setFlash('Unknown error');
>>>      }
>>> } else {
>>>      $this->Session->setFlash('This category is not empty');
>>> }
>>> $this->redirect($this->referer());
>>>
>>> -- 
>>> Our newest site for the community: CakePHP Video Tutorials 
>>> http://tv.cakephp.org
>>> Check out the new CakePHP Questions site http://ask.cakephp.org and 
>>> help others with their CakePHP related questions.
>>>
>>>
>>> To unsubscribe from this group, send email to
>>> [hidden email] </user/SendEmail.jtp?type=node&node=5708378&i=0> For 
>>> more options, visit this group at 
>>> http://groups.google.com/group/cake-php
>>>
>>>
>>> ------------------------------------------------------------------------
>>> If you reply to this email, your message will be added to the 
>>> discussion below:
>>> http://cakephp.1045679.n5.nabble.com/error-code-from-delete-or-beforeDelete-tp5708340p5708378.html
>>>  
>>>
>>> To start a new topic under CakePHP, email [hidden email] 
>>> </user/SendEmail.jtp?type=node&node=5708382&i=0>
>>> To unsubscribe from CakePHP, click here.
>>> NAML 
>>> <http://cakephp.1045679.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>>  
>>>
>>
>> ------------------------------------------------------------------------
>> View this message in context: Re: error code from delete or 
>> beforeDelete? 
>> <http://cakephp.1045679.n5.nabble.com/error-code-from-delete-or-beforeDelete-tp5708340p5708382.html>
>> Sent from the CakePHP mailing list archive 
>> <http://cakephp.1045679.n5.nabble.com/> at Nabble.com.
>> -- 
>> Our newest site for the community: CakePHP Video Tutorials 
>> http://tv.cakephp.org
>> Check out the new CakePHP Questions site http://ask.cakephp.org and 
>> help others with their CakePHP related questions.
>>
>>
>> To unsubscribe from this group, send email to
>> [hidden email] </user/SendEmail.jtp?type=node&node=5708399&i=0> For 
>> more options, visit this group at http://groups.google.com/group/cake-php
>
> -- 
> Our newest site for the community: CakePHP Video Tutorials 
> http://tv.cakephp.org
> Check out the new CakePHP Questions site http://ask.cakephp.org and 
> help others with their CakePHP related questions.
>
>
> To unsubscribe from this group, send email to
> [hidden email] </user/SendEmail.jtp?type=node&node=5708399&i=1> For 
> more options, visit this group at http://groups.google.com/group/cake-php
>
>
> ------------------------------------------------------------------------
> If you reply to this email, your message will be added to the 
> discussion below:
> http://cakephp.1045679.n5.nabble.com/error-code-from-delete-or-beforeDelete-tp5708340p5708399.html
>  
>
> To start a new topic under CakePHP, email 
> [email protected]
> To unsubscribe from CakePHP, click here 
> <http://cakephp.1045679.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=1255722&code=YmlsbC5zdG9sdHpAYm9vc3RlcndlYnNvbHV0aW9ucy5jb218MTI1NTcyMnwtNTU0NTk2MTUy>.
> NAML 
> <http://cakephp.1045679.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>  
>


--
View this message in context: 
http://cakephp.1045679.n5.nabble.com/error-code-from-delete-or-beforeDelete-tp5708340p5708404.html
Sent from the CakePHP mailing list archive at Nabble.com.

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
[email protected] For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to