Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Excepciones apropiadas

Estas en el tema de Excepciones apropiadas en el foro de PHP en Foros del Web. Buenas noches. Esto es tan solo una pregunta de buenas practicas, tengo el siguiente codigo: Código PHP: <!DOCTYPE HTML> <html> <head>     <meta charset="UTF8"> </head> <body> <?php define ...
  #1 (permalink)  
Antiguo 10/07/2013, 15:51
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 12 años, 8 meses
Puntos: 34
Excepciones apropiadas

Buenas noches.

Esto es tan solo una pregunta de buenas practicas, tengo el siguiente codigo:

Código PHP:
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF8">
</head>
<body>

<?php

define
'CONTROLLER_PATH''controllers/' );
define'EXT''.php' );


// Dividimos la URL.
$requestURI explode'/'$_SERVER['REQUEST_URI'] );
// Eliminamos los espacios del principio y final.
$requestURI array_valuesarray_filter$requestURI ) );

$controllerName ucfirst$requestURI[0] );
$controllerPath CONTROLLER_PATH $controllerName EXT;

try
{
    
// Comprobamos que el controlador existe.
    
if ( ! file_exists$controllerPath ) )
    {
        throw new 
DomainException'El archivo <code>' $controllerPath '</code> no existe.' );
    }

    require_once 
$controllerPath;    

    if ( ! 
is_callable$controllerName ) )
    {
        throw new 
RuntimeException'El archivo <code>' $controllerPath '</code> debe contener un objeto <code>' $controllerName '</code>.' );
    }
}
catch ( 
RuntimeException $e )
{
    echo 
$e->getMessage();
}
catch ( 
DomainException $e )
{
    echo 
'<strong>Error 404.</strong> ' $e->getMessage();
}

?>

</body>
</html>
Como podeis ver lanzo dos excepciones, pero, ¿son las apropiadas para cada caso? No se si me explico, ¿son las excepciones que acompañan a cada tipo de error o deberia utilizar otra de las clases predefinidas?

Y ya de paso otra pregunta, ¿como puedo comprobar si un objeto es instanciable (o si esta definido en su defecto)? Notareis en el codigo que is_callable() no funciona.

Muchas gracias a todos. Saludos.
  #2 (permalink)  
Antiguo 10/07/2013, 16:18
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Excepciones apropiadas

Te ayudo con tu seguna pregunta..... method_exists() e is_callable() son para METODOS y no para los objetos en si

Si quieres saber si algo es un objeto es con is_object() sino si quieres saber si es de un tipo particular haces uso del operadir instanceof

Luego si es un objeto ya puedes preguntarle a ese objeto por un METODO
__________________
Salu2!
  #3 (permalink)  
Antiguo 10/07/2013, 16:33
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 12 años, 8 meses
Puntos: 34
Respuesta: Excepciones apropiadas

is_object() comprueba que una variable sea un objeto, y instanceof comprueba que una variable sea instancia de un objeto. Lo que necesito es saber si un objeto se puede llamar pero antes de llamarlo, o en su defecto, llamarlo sin que produzca ningun error y comprobar si existe.

Saludos.
  #4 (permalink)  
Antiguo 10/07/2013, 16:40
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Excepciones apropiadas

Has probado con is_callable??

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 10/07/2013, 16:44
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 12 años, 8 meses
Puntos: 34
Respuesta: Excepciones apropiadas

Es la que está en el código, no funciona (o la empleo mal).

Saludos.
  #6 (permalink)  
Antiguo 10/07/2013, 16:50
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Excepciones apropiadas

Tu incluyes el controlador para luego crear una instancia de ese controlador?

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #7 (permalink)  
Antiguo 10/07/2013, 16:58
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 12 años, 8 meses
Puntos: 34
Respuesta: Excepciones apropiadas

Me gustaría no tener que crear una instacia si pudiese ser.
  #8 (permalink)  
Antiguo 10/07/2013, 17:01
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Excepciones apropiadas

Mmm pues me gustaría que nos explicaras cual quieres que sea el funcionamiento de ese código, seria bueno saber cual debe ser el comportamiento para de esta manera poder o mejorar el código propuesto o tratarlo de hacer de otra manera

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #9 (permalink)  
Antiguo 10/07/2013, 17:06
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Excepciones apropiadas

En la doc las excepciones tienen una pequeña descripción que indica cuando se deberían utilizar, en tu ejemplo todas son Runtime pero esto como tantas otras cosas es subjetivo.
Sobre como comprobar si un objeto es instanciable, simplemente comprueba que la clase existe con class_exists

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 10/07/2013, 17:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Excepciones apropiadas

Cita:
Iniciado por masterpuppet Ver Mensaje
Sobre como comprobar si un objeto es instanciable, simplemente comprueba que la clase existe con class_exists
Pues en realidad una clase puede ser abstracta o puede ser concreta pero con su constructor privado (o protected aunque no tiene sentido protected) ...en conclusion, eso no es suficiente

Código PHP:
Ver original
  1. <?php
  2.  
  3. Class MedejoInstanciar{
  4. }
  5.  
  6. Class NoMeInstancies{
  7.    private function __construct(){}
  8.  
  9.    public function some_function(){
  10.       // ...
  11.    }
  12. }
  13.  
  14.  
  15. var_dump(get_class_methods('NoMeInstancies'));
  16.  
  17. $classes = array ('Algo','MedejoInstanciar','NoMeInstancies');
  18.  
  19. foreach ($classes as $class)
  20. {
  21.     if (class_exists($class)){
  22.         echo "$class existe .. <br/>";
  23.         if (method_exists($class,'__construct')){
  24.             echo "Constructor existe en $class<br/>";  
  25.             $metodos_publicos = get_class_methods($class);        
  26.             if (array_search('__construct',$metodos_publicos))
  27.                 echo "Constructor es Publico => $class es INSTANCIABLE";
  28.             else
  29.                 echo "De malas con $class pues NO es instanciable";
  30.         }else
  31.             echo "Constructor NO existe en $class<br/>";
  32.     }else
  33.         echo "$class NO existe .. <br/>";
  34. }

Es un ejemplo.... no es para que lo uses asi!
__________________
Salu2!

Última edición por Italico76; 10/07/2013 a las 17:32
  #11 (permalink)  
Antiguo 10/07/2013, 17:40
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Excepciones apropiadas

@Italico76, eso es buscarle el pelo al huevo en el contexto del OP es mas que suficiente, y si necesitas tanta introspección utiliza Reflection.
__________________
http://es.phptherightway.com/
thats us riders :)
  #12 (permalink)  
Antiguo 10/07/2013, 17:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Excepciones apropiadas

Cita:
Iniciado por masterpuppet Ver Mensaje
@Italico76, eso es buscarle el pelo al huevo en el contexto del OP es mas que suficiente, y si necesitas tanta introspección utiliza Reflection.
Me parece importante chequear si el constructor es privado.. pues en clases con todos metodos estaticos es buena idea impedir la instanciacion...

Ahora... nada de esto es infalible .... pues ni siquiera con Reflection puedes darte cuenta que un Singleton es instanciable ... o si ?


Voy a cambiar una parte del codigo:

Código PHP:
Ver original
  1. foreach ($classes as $class)
  2. {
  3.     if (class_exists($class)){
  4.         echo "$class es una clase... <br/>";
  5.         $metodos_publicos = get_class_methods($class);        
  6.         $public_construct_exists = array_search('__construct',$metodos_publicos);
  7.  
  8.         if (method_exists($class,'__construct')){
  9.             echo "Constructor existe en $class<br/>";            
  10.             if ($public_construct_exists)
  11.                 echo "Constructor es Publico => $class es INSTANCIABLE";            
  12.                
  13.         }else{
  14.             echo "Constructor NO existe en $class<br/>";
  15.             if (!$public_construct_exists){
  16.                 echo '... pero SI es instanciable (de no ser abstracta)<br/>';
  17.             }
  18.                
  19.         }
  20.  
  21.     }else
  22.         echo "$class NO es una clase (!) <br/>";
  23.  
  24.     echo '<p/>';
  25. }


Ahi me cubro del caso de mas casos ... ojala no se considere "duplicado" pues mi unica intencion es ayudar
__________________
Salu2!

Última edición por Italico76; 10/07/2013 a las 18:03
  #13 (permalink)  
Antiguo 10/07/2013, 18:20
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Excepciones apropiadas

Yo entiendo que hay precondiciones y que en el directorio controllers hay controladores y no papas, de todas formas como te comente antes, si es necesaria tanta introspección preferible Reflection

Código PHP:
Ver original
  1. $reflector = new ReflectionClass('FooClass');
  2. if ($reflector->isInstantiable()) {
  3.     ...
  4. }
y bueno sobre el antipattern de Singleton no es necesario saber si es instanciable siempre se puede forzar la instanciacion con Reflection.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #14 (permalink)  
Antiguo 10/07/2013, 18:34
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Excepciones apropiadas

@masterpuppet: nunca use ninguna de las clases de Reflection asi pues no conocia el metodo isInstantiable() pero es bueno saber hay una forma facil e incluso mejor de chequeo, +1
__________________
Salu2!
  #15 (permalink)  
Antiguo 11/07/2013, 01:13
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 12 años, 8 meses
Puntos: 34
Respuesta: Excepciones apropiadas

Bien, ya está solucionado, muchas gracias @masterpuppet y @Italico76.

Respecto a todo lo que comentáis… ni siquiera había planteado que los controladores sean abstractos, estáticos o contengan rosas, es para un tutorial y me basta con mostrar el ejemplo del funcionamiento, es decir que el index.php haga de enrrutador y llame a los controladores. Luego es cosa de cada uno implementarlo y moldearlo a su manera.

Saludos y gracias de nuevo.

Etiquetas: excepciones, html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:05.