Foros del Web » Programando para Internet » PHP »

PHP OO Colocar excepciones TRY-CATCH

Estas en el tema de Colocar excepciones TRY-CATCH en el foro de PHP en Foros del Web. Buenas noches! Estoy tratando de colocarle excepciones a un código que estoy utilizando: Código PHP: spl_autoload_register (function( $clase ){         include  strtolower ( $clase ). '.php' ...
  #1 (permalink)  
Antiguo 18/12/2014, 23:38
 
Fecha de Ingreso: septiembre-2011
Mensajes: 233
Antigüedad: 12 años, 7 meses
Puntos: 1
Colocar excepciones TRY-CATCH

Buenas noches! Estoy tratando de colocarle excepciones a un código que estoy utilizando:

Código PHP:
spl_autoload_register(function($clase){
        include 
strtolower($clase).'.php';
    });
    Class 
Categoria{

        private 
$idCategoriaArea;
        private 
$nombreCategoria;

        public function 
__construct($idCategoriaArea=null,$nombreCategoria=null)
        {
            
$this->idCategoriaArea=$idCategoriaArea;
            
$this->nombreCategoria=$nombreCategoria;

        }

        public function 
getIdCategoria(){
            return 
$this->idCategoriaArea;
        }
        public function 
getNombCategoria(){
            return 
$this->nombreCategoria;
        }
        public function 
setIdCategoria($idCategoriaArea){
            
$this->idCategoriaArea=$idCategoriaArea;
        }
        public function 
setNombCategoria($nombreCategoria){
            
$this->nombreCategoria=$nombreCategoria;
        }
public function 
ObtenerTodasCategoria(){
            try {
                    
$categoria=array();
                    
$db=new Conexion();
                    
$conexion=$db->conectar();
                    
$consulta=$conexion->prepare('SELECT idCategoriaArea, nombreCategoria FROM categoriaarea ORDER BY idCategoriaArea desc');
                    
$consulta->execute();
                    
$resultado $consulta->get_result();
                    while(
$fila=$resultado->fetch_assoc())
                    {
                        
$cat=new Categoria($fila['idCategoriaArea'],$fila['nombreCategoria']);
                        
array_push($categoria$cat);
                    }
                    return 
$categoria;
            } catch (
Exception $e) {
                echo 
$e->getMessage();
            }} 
este es el html:
Código HTML:
<option value="" selected>Seleccione</option>
				<?php
					require_once('categoria.class.php');
						$obj=new Categoria();
						$categoria=$obj->ObtenerTodasCategoria();
						foreach ($categoria as $cat){

							echo '<option value="'.$cat->getIdCategoria().'">'.utf8_decode($cat->getNombCategoria()).'</option>';
						}
				?>

			</select> 
Pero mi duda es recomendable colocarlo en la función de la clase? o en el foreach del formulario?
Me gustaría si por casualidad ven algo en el código en especifico me comentarán
  #2 (permalink)  
Antiguo 19/12/2014, 11:07
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Colocar excepciones TRY-CATCH

Es sencillo tus clases deben de lanzar excepciones, no manejarlas. Así que mueve el try/catch fuera de tu clase
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 19/12/2014, 14:20
 
Fecha de Ingreso: septiembre-2011
Mensajes: 233
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Colocar excepciones TRY-CATCH

Hola hhs, movi el try catch fuera de la clase, y leyendo el manual de php, coloque el throw new Exception cuando se ejecuta la consulta asi:

Código PHP:
$consulta->execute() or throw new Exception('Error en la consulta.'); 
y en el html coloque el try catch:
Código HTML:
<select id='combo'>
<option value="" selected>Seleccione</option>
<?php
require_once('categoria.class.php');
 try {
$obj=new Categoria();
$categoria=$obj->ObtenerTodasCategoria();
foreach ($categoria as $cat){
echo '<option value="'.$cat->getIdCategoria().'">'.utf8_decode($cat->getNombCategoria()).'</option>';
}
} catch (Exception $e) {
                echo $e->getMessage();
            }
?>
</select> 
Asi debería es que se debe de trabajar con el try catch?
  #4 (permalink)  
Antiguo 19/12/2014, 14:45
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Colocar excepciones TRY-CATCH

Es correcto.
Solo un detalle en esta linea de código:
Código PHP:
Ver original
  1. $consulta->execute() or throw new Exception('Error en la consulta.');
Lo adecuado es que la clase Conexion dispare la excepción si sucede algo inesperado en el método execute, pero si es de terceros el código y no quieres meterte en líos déjalo así.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 19/12/2014, 15:04
 
Fecha de Ingreso: septiembre-2011
Mensajes: 233
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Colocar excepciones TRY-CATCH

Cita:
Iniciado por hhs Ver Mensaje
Lo adecuado es que la clase Conexion dispare la excepción si sucede algo inesperado en el método execute, pero si es de terceros el código y no quieres meterte en líos déjalo así.
El código lo programe yo, en ese caso como podría ser para que la clase dispare la excepción?
  #6 (permalink)  
Antiguo 19/12/2014, 17:06
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Colocar excepciones TRY-CATCH

Publica el código de tu clase, pero es igual que en tu primer caso, no importa cual de las dos clases lance una excepción el try/catch la manejara.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 19/12/2014, 18:00
 
Fecha de Ingreso: septiembre-2011
Mensajes: 233
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Colocar excepciones TRY-CATCH

Cita:
Iniciado por hhs Ver Mensaje
Publica el código de tu clase, pero es igual que en tu primer caso, no importa cual de las dos clases lance una excepción el try/catch la manejara.
este es el código de la clase categoria.php
Código PHP:
<?php

spl_autoload_register
(function($clase){
        include 
strtolower($clase).'.php';
    });
    Class 
Categoria{

        private 
$idCategoriaArea;
        private 
$nombreCategoria;

        public function 
__construct($idCategoriaArea=null,$nombreCategoria=null)
        {
            
$this->idCategoriaArea=$idCategoriaArea;
            
$this->nombreCategoria=$nombreCategoria;

        }

        public function 
getIdCategoria(){
            return 
$this->idCategoriaArea;
        }
        public function 
getNombCategoria(){
            return 
$this->nombreCategoria;
        }
        public function 
setIdCategoria($idCategoriaArea){
            
$this->idCategoriaArea=$idCategoriaArea;
        }
        public function 
setNombCategoria($nombreCategoria){
            
$this->nombreCategoria=$nombreCategoria;
        }

        public function 
insertar(){
                
$link=new Conexion();
                
$conexion=$link->conectar();
                
$consulta=$conexion->prepare('INSERT INTO categoriaarea (nombreCategoria) VALUES (?)');
                
$consulta->bind_param('s',$this->nombreCategoria);
                if(
$consulta->execute())
                {
                    
$conexion->close();
                    
$consulta->close();
                    return 
true;
                }
                else{
                    
$conexion->close();
                    
$consulta->close();
                    return 
false;
                }

        }

        public function 
Buscar($value){
                
$link=new Conexion();
                
$conexion=$link->conectar();
                
$consulta=$conexion->prepare('SELECT * FROM categoriaarea WHERE nombreCategoria=?');
                
$consulta->bind_param('s',$value);
                
$consulta->execute();
                
$consulta->store_result();
                
$num=$consulta->num_rows;
                if(
$num>=1){
                    
$conexion->close();
                    
$consulta->close();
                    return 
true;
                }
                else{
                    
$conexion->close();
                    
$consulta->close();
                    return 
false;
                }
        }

        public function 
ObtenerTodasCategoria(){
    
                    
$categoria=array();
                    
$db=new Conexion();
                    
$conexion=$db->conectar();
                    
$consulta=$conexion->prepare('SELECT idCategoriaArea, nombreCategoria FROM categoriaarea ORDER BY idCategoriaArea desc');
                    
$consulta->execute();
                    
$resultado $consulta->get_result();
                    while(
$fila=$resultado->fetch_assoc())
                    {
                        
$cat=new Categoria($fila['idCategoriaArea'],$fila['nombreCategoria']);
                        
array_push($categoria$cat);
                    }
                    return 
$categoria;
        }
    }
?>
y este es el código de mi clase conexión.php
Código PHP:
<?php
    
    
Class Conexion{

        private 
$server='localhost';
        private 
$usuario='root';
        private 
$pass='';
        private 
$mainDataBase='sistema';
        
             
/*Realiza la conexión a la base de datos.*/
       
public function conectar(){
          
$link=new mysqli($this->server$this->usuario$this->pass,$this->mainDataBase);

         
//  //Si sucede algún error la función muere e imprimir el error
        
if($link->connect_error){
            die(
"Error en la conexion : ".$link->connect_errno."-".$link->connect_error);
        }

        
//evitando problemas con acentos
        
$link->query("SET NAMES 'utf8'");
        
        return 
$link;
        }
       
    }

?>

Etiquetas: excepciones, formulario, html, select, try-catch
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 21:05.