none
Buenas prácticas try-catch: se puede guardar en BDD SQL ante un catch para controlar errores? RRS feed

  • Debate general

  • Buenas, como están amigos? Les comparto mi código, quisiera saber ante cualquier tipo de error en el try guardar la excepción en una tabla de mi BDD, y si no hay excepción, guardar ciertos datos que me interesan en otra tabla de mi BDD.

    El problema me surge que al guardar en el catch con ctx.savechanges() y al no estar controlado con otro try catch, revienta en el caso de por ejemplo no haya comunicación con el server de mi BDD.

    Cual es la buena práctica en estos casos? Como puedo hacer que el programa no reviente y pueda continuar hasta el final con lo que les comenté? 

    namespace BalanzaCamiones.Consola
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                try
                {
                    //leer ult fecha desde bdd SQL
                    BalanzaCamionesService servicio = new BalanzaCamionesService();
                    LOGPESADAS ultreg = servicio.obtenerUltimoRegEnviadoSAP();
                    //Console.WriteLine(ultreg);
    
                    //voy a buscar los datos al fdb
                    DataTable dt = servicio.ObtenerDatosBalanza(ultreg.FechaAlta);
                    
                    SendPesadasRequest listaPesadas = new SendPesadasRequest();
    
    
                    listaPesadas.PosicionesPesadas = (from DataRow dr in dt.Rows
                               select new PesadaCamion()
                               { Doc_Transporte = Convert.ToString(dr["DOCTRANSPORTE"]),
                                Fecha_I = Convert.ToString(dr["FECHAE"]),
                                Fecha_S = Convert.ToString(dr["FECHAS"]),
                                Id_Producto = Convert.ToString(dr["IDPRODUCTO"]),
                                Peso = Convert.ToString(dr["NETO"])}).ToList();
    
                    
                    //enviar a SAP
                    var responseSAP = servicio.UpdateBalanzaCamiones(listaPesadas.PosicionesPesadas);
    
                    
    
    
                }
                catch (Exception e)
                    {
    
                    using (var ctx = new INTBALGDAEntities())
                    {
                        ERRORES error = new ERRORES();
                        
                        error.Descripcion = e.ToString();
                        error.FechaAlta = DateTime.Now;
                      
                        ctx.ERRORES.Add(error);
                        ctx.SaveChanges();
    
                    }
                }
            }
        }
    }
    

    Muchas gracias

    Rodrigo

    viernes, 16 de abril de 2021 9:00

Todas las respuestas

  • Cuando un programa que maneja base de datos produce errores, es corrientísimo que los errores ocurran precisamente en la base de datos. Por lo tanto, no es nada recomendable usar la propia base de datos para registrar las excepciones.

    La solución más común es guardarlas en archivos en disco. En principio, la ocurrencia de una excepción debería ser un caso extraordinario, no algo que se produce con frecuencia, por lo que el volumen del archivo en cuestión debería mantenerse moderado; no debería ser necesario usar una base de datos para poder analizar las excepciones.

    Aunque podrías escribir tu propio código de logging, es más común hacer uso de alguna librería bien conocida y bien probada. Por ejemplo, una de las más conocidas es Log4Net. La puedes añadir a tu proyecto como paquete NuGet, y una vez configurada, desde el catch harías simplemente algo así como Logger.Error("mensaje", e) y eso ya almacena el mensaje deseado así como todos los detalles de la excepción. Editando el archivo .config se puede cambiar el destino en donde se graba el Log. Hay muchas opciones, y aunque suele utilizarse un fichero, puedes hacer que vaya a una base de datos, en cuyo caso te recomendaría que sea otra base de datos diferente de la que usa el programa, en previsión de que haya errores en esta última. Si usas un fichero, puedes cambiar la ubicación, el formato, el nivel de logueo (puedes usar varios en el programa), el tamaño máximo del fichero antes de que se renombre y se cree uno nuevo, el número de ficheros a conservar, etc., etc.

    viernes, 16 de abril de 2021 15:46