Foros del Web » Programando para Internet » PHP »

Excepcion personalizada

Estas en el tema de Excepcion personalizada en el foro de PHP en Foros del Web. Buenas tengo problemas con realizar un extends de una excepcion tengo 3 carpetas: -BD -Entidades -Negocio en Entidades cree sdcE.php conteniendo la clase heredada excepcion ...
  #1 (permalink)  
Antiguo 24/06/2012, 14:56
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Excepcion personalizada

Buenas tengo problemas con realizar un extends de una excepcion

tengo 3 carpetas:

-BD
-Entidades
-Negocio

en Entidades cree sdcE.php conteniendo la clase heredada excepcion :

Código PHP:
class SdcE extends Exception{
        
    protected 
$categoria;
    protected 
$mensajeAplicativo;
    protected 
$mensajeUsuario;
    
    public function 
__construct($categoria,$mensajeAplicativo,$mensajeUsuario) {

        
$this->categoria $categoria;
        
$this->mensajeAplicativo $mensajeAplicativo;
        
$this->mensajeUsuario $mensajeUsuario;
        
        
parent::__construct($categoria$mensajeAplicativo,$mensajeUsuario); 
    }
    
    public function 
getCategoria() {
        return 
$this->categoria;
    }
    public function 
getMensajeAplicativo() {
        return 
$this->mensajeAplicativo;
    }
    public function 
getMensajeUsuario() {
        return 
$this->mensajeUsuario;
    }

En la carpeta BD cree conexion.php y consultas_SQL que contiene las consultas con sus respectivos throws :

conexion.php

Código PHP:
include('../Entidad/sdcE.php');

    class 
MySQL{

          private 
$conexion
          private 
$total_consultas;

          public function 
__construct()  
        {  
           
$this->conexion mysql_connect(config::getBBDDServer(),config::getBBDDUser(),config::getBBDDPwd());
                
              if(!
$this->conexion){
                  throw new 
SdcE (0,'Error en la conexión',mysql_error($this->conexion));
              }  
              
              if(!
mysql_select_db(config::getBBDDName(),$this->conexion)){
                  throw new 
SdcE (1,'Error al seleccionar la BD',mysql_error($this->conexion));
              }
        }  
        
        public function 
__destruct()  
        {  
            
mysql_close($this->conexion);  
        }  
          

          public function 
consulta($consulta){ 
            
$this->total_consultas++; 
            
$resultado mysql_query($consulta,$this->conexion);
            if(!
$resultado){ 
                throw new 
SdcE(2,'Error en Sentencia BD',mysql_error($this->conexion));
            }else{
                return 
$resultado;    
            }
          }

      public function 
fetch_array($consulta){
       return 
mysql_fetch_array($consulta);
      }
    
      public function 
num_rows($consulta){
       return 
mysql_num_rows($consulta);
      }
    
      public function 
getTotalConsultas(){
       return 
$this->total_consultas
      }
      
      public function 
getConexion(){
       return 
$this->conexion
      }

consultas_SQL.php

Código PHP:
include_once('conexionBD.php');


    class 
SQLSisdeclas{
        
        private 
$db;
        private 
$conexion;
        
        public function 
SQLSisdeclas(){
            
            
$this->db = new MySQL();
            
$this->conexion $this->db->getConexion();    
        }
        
        public function 
obtenerUltimoPeriodo(){
                
            try{
                
                
$sql  "SELECT max(pa.id) ";
                
$sql .= "FROM periodoacademico pa ";
       
                
$mysqlQuery mysql_fetch_array($this->db->consulta($sql));
                return 
$mysqlQuery;
                
            }catch(
exception $e){
                throw 
$e;
            }catch(
SdcE $ex){
                throw 
$ex;
            }

        }
        
    } 
y en negocio la operacion


Código PHP:
class Operaciones{
   public 
$dp;
   public 
$BD;
   
    function 
obtenerCursosMatriculados($id=NULL){
            
        try{
             
            
$BD = new SQLSisdeclas();
            
$tabla $BD->obtenerUltimoPeriodo();
          
                          
            return 
$id;
            
        }catch(
exception $e){
            return 
$e->getMessage();
        }catch(
SdcE $ex){
            return 
$ex->getCategoria();
        }
    }
    


Si en vez de SdcE en los throw uso Exception, me devuelve el mensaje de excepcion normal. (es decir si funciona con Exception).

Pero asi con una excepcion extendida no me funciona. Que puedo estar haciendo mal?.

gracias de antemano.
  #2 (permalink)  
Antiguo 24/06/2012, 17:58
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Excepcion personalizada

mi duda es si en el try/catch estas capturando la excepción para que volver a lanzarla?? sería mejor si lo que quieres es mostrarla que implementaras un __toString en tu clase personalizada para las excepciones por ejemplo
Código PHP:
Ver original
  1. class SdcE extends Exception{
  2.          
  3.     protected $categoria;
  4.     protected $mensajeAplicativo;
  5.     protected $mensajeUsuario;
  6.      
  7.     public function __construct($categoria,$mensajeAplicativo,$mensajeUsuario) {
  8.  
  9.         $this->categoria = $categoria;
  10.         $this->mensajeAplicativo = $mensajeAplicativo;
  11.         $this->mensajeUsuario = $mensajeUsuario;
  12.          
  13.         parent::__construct($categoria, $mensajeAplicativo,$mensajeUsuario);  
  14.     }
  15.      
  16.     public function getCategoria() {
  17.         return $this->categoria;
  18.     }
  19.     public function getMensajeAplicativo() {
  20.         return $this->mensajeAplicativo;
  21.     }
  22.     public function getMensajeUsuario() {
  23.         return $this->mensajeUsuario;
  24.     }
  25.  
  26.    public function __toString() {
  27.        return 'Error ' . $this->mensajeAplicativo . ' ' . $this->mensajeUsuario;
  28.    }
  29. }  
  30. try {
  31. /* lo que hagas */
  32. } catch(SdcE $e) {
  33.     echo $e;
  34. }
espero haberte entendido y que te sea de ayuda, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 24/06/2012, 18:53
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Excepcion personalizada

Hola gracias por responder.

digamos en consultas_SQL.php el try/catch es para detectar algún problema de BD.
en operación el try/cath es para prever errores que pueda rellenar en ese método (no esta completo) por eso lo hago dos veces, pero en operacion.php no detecta la excepcion anterior. No sabría como utilizar el método me pusiste "__tostring()".
  #4 (permalink)  
Antiguo 24/06/2012, 19:14
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: Excepcion personalizada

Te da algún error ?, o simplemente ignora el catch ?, y ten en cuenta que el orden de los catch's importa, las excepciones mas genéricas deben ir hacia el final del stack y Exception siempre debe estar a lo último, tal cual lo tienes siempre se captura en el primer catch....

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 24/06/2012, 19:33
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Excepcion personalizada

ademas de lo que te comenta masterpuppet tendríamos que ver una implementación que hagas de Operaciones que es donde al final vas a capturar la excepción porque en SQLSisdeclas lo que haces es relanzar la excepción para ser capturada por Operaciones pero en esta solo retornas el mensaje que capturaste, o sino paso nada te retorna el id, ahora la pregunta correcta es, en algún momento de la implementación del código imprimes la excepción?? porque como te digo mientras no la imprimas no vas a obtener nada en la pantalla
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: excepcion, mysql, personalizada, sql, tabla, usuarios
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 17:18.