C# | Anidamiento de bloques de prueba y captura

En C#, se permite anidar el bloque try & catch. El anidamiento del bloque de prueba significa que un bloque de prueba se puede anidar en otro bloque de prueba. Los diversos programadores usan el bloque de prueba externo para manejar excepciones graves, mientras que el bloque interno para manejar excepciones normales.

Nota:

  • Si surge una excepción en el bloque de prueba interno que no es capturada por el bloque de captura asociado con el bloque de prueba, entonces la excepción se promueve al bloque de prueba externo. En general, los bloques de prueba anidados se utilizan para permitir que diferentes grupos de errores se manejen de diferentes maneras.
  • Es una condición necesaria que un bloque de prueba debe ser seguido por un bloque de captura o finalmente porque si usa un bloque de prueba sin una captura o finalmente, tenderá a un error de tiempo de compilación.

Sintaxis:

// outer try block
try
{

   // inner try block
   try
     {
       // code...
     }

   // inner catch block
   catch
     {
       // code...
     }
}

// outer catch block
catch
  {
    // code...
  }

A continuación se dan algunos ejemplos para entender la implementación de una mejor manera:

Ejemplo 1: en este programa, DivideByZeroException se genera dentro del bloque de prueba interno que es capturado por un bloque de captura asociado con el bloque de prueba interno y continúa el flujo del programa. Cuando IndexOutOfRangeException se genera dentro del bloque de prueba interno que no es capturado por el bloque de captura interno, el bloque de prueba interno transfiere esta excepción al bloque de prueba externo. Después de eso, el bloque catch asociado con el bloque try externo detectó la excepción que hace que el programa finalice. Aquí, para 17/0 y 24/0 , se está ejecutando el bloque de captura interno, pero para el número 25 se está ejecutando el bloque externo de captura.

// C# program to illustrate how outer
// try block will handle the exception
// which is not handled by the inner 
// try catch block
using System;
  
class GFG {
      
    // Main Method
    static void Main()
    {
  
        // Here, number is greater
        // than divisor.
        int[] number = {8, 17, 24, 5, 25};
        int[] divisor = {2, 0, 0, 5};
  
        // Outer try block
          
        // Here IndexOutOfRangeException occurs
        // due to which program may terminates
        try {
              
            for (int j = 0; j < number.Length; j++) {
  
                // Inner try block
                  
                // Here DivideByZeroException caught
                // and allow the program to continue 
                // its execution
  
                try {
                      
                    Console.WriteLine("Number: " + number[j] + 
                                      "\nDivisor: " + divisor[j] + 
                                      "\nQuotient: " + number[j] / divisor[j]);
                }
                  
                // Catch block for inner try block
                catch (DivideByZeroException) {
                      
                    Console.WriteLine("Inner Try Catch Block");
                }
            }
        }
  
        // Catch block for outer try block
        catch (IndexOutOfRangeException) {
              
            Console.WriteLine("Outer Try Catch Block");
              
        }
    }
}
Producción:

Number: 8
Divisor: 2
Quotient: 4
Inner Try Catch Block
Inner Try Catch Block
Number: 5
Divisor: 5
Quotient: 1
Outer Try Catch Block

Ejemplo 2: en el siguiente ejemplo, se genera una excepción dentro del bloque de prueba interno que es capturado por el bloque de captura asociado con el bloque de prueba interno.

// C# program to illustrate
// nested try block
using System;
  
public class Geeks {
  
    public string Author_name
    {
        get;
        set;
    }
}
  
// Driver Class
public class GFG {
      
      
    // Main Method
    public static void Main()
    {
        Geeks str1 = null;
  
        // outer try block
        try {
              
            // inner try block
            try {
                  
                str1.Author_name = "";
            }
  
            // catch block for the inner try block
            catch {
                  
                Console.WriteLine("Inner try catch block");
            }
        }
          
        // catch block for the outer try block
        catch {
              
            Console.WriteLine("Outer try catch block");
        }
    }
}
Producción:

Inner try catch block

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *