C# también dispone de control de excepciones, y al igual que C++ o Java podemos crear y lanzar nuestras propias excepciones. Primero veamos como se capturan:
/**
* Excepciones.cs
* Clase que muestra el uso de excepciones
* no muy distinta de otros lenguajes
*/


using System;

public class Excepcion
{

	// Método principal
	public static void Main()
	{
		int valor;
		string entrada;
		int[] vector = new int[4]{4,7,1,0};

		System.Console.WriteLine("Introduce un número");

		// Vamos a tomar un valor de la entrada standar
		entrada = System.Console.ReadLine();

		// Y ahora trataremos de convertirlo a entero.
		// Pero ¿que pasa si no nos han pasado un número? Hay que controlarlo con try-catch
		try
		{
			valor = Convert.ToInt32(entrada);

			// Si todo va OK seguirá la ejecución por aquí
			// en caso contrario saltara al bloque catch
			System.Console.WriteLine("El número introducido es: {0}", valor);
		}
		catch (Exception e)
		{
			System.Console.WriteLine("Lo que has metido NO es un número: {0}", entrada);
			// Podemos volcar el error
			System.Console.WriteLine("Error devuelto: {0}", e);
		}

		// Existen distintos tipos predefinidos de excepciones, e incluso se pueden
		// definir excepciones propias. También se puede encadenar la captura de excepciones
		// según el error que ocurra. Lo lógico es empezar con las excexpciones más concretas
		// Veamos que pasa cuando nos pasamos  de rango en un arreglo
		try
		{
			for (int i = 0; i < 8; i++)
			{
				System.Console.WriteLine("Valor[{0}]: {1}", i, vector[i]);
			}
		}
		catch (IndexOutOfRangeException e)
		{
			System.Console.WriteLine("El array no da para más {0}, error {1}", vector.Length, e);
		}
		catch (Exception e) // Al final tratamos de capturar la excepción  genérica.
		{
			System.Console.WriteLine("Ocurrió otra excepción, error {1}", e);
		}
		// Podemos meter la claúsula finally que se ejecutará para terminar el trato
		// de la excepcion
		finally
		{
			System.Console.WriteLine("Ya pasó todo");
		}

	}
}
Y ahora vemos como definir un par de excepciones propias. Para ello se usa la herencia de la superclase Exception.
/**
* MisExcepciones.cs
* Clase que muestra como definir nuestras propias excepciones
* Debemos crear una clase que herede de la superclase Exception
*/

using System;

// Creamos una excepcion que salte cuando se metan valores
// mayores de diez
public class MayorQueDiez : Exception {}

// Creamos una excepcion que salte con los valores
// menores que 0. Implementamos sus constructores
public class MenorQueCero : Exception
{
	// Constructor mínimo
	public MenorQueCero ()
	{
	}

	// Constructor con parámetro
	public MenorQueCero( string e ) : base (e)
	{
		System.Console.WriteLine("Estamos dentro de nuestra excepción: {0}",e);
	}

	// Constructor con parámetros
	public MenorQueCero( string e, Exception inner ) : base ( e, inner )
	{
	}
}

// Aquí creamos una clase para probar las excepciones
public class Numeros
{
	// Constructor
	public Numeros ()
	{
	}

	// Recoge un valor, en caso de no cumplir condiciones
	// hacemos saltar la excepción
	public void recogeValor ()
	{
		string linea;
		int valor;

		// Vamos a tomar un valor de la entrada standar
		linea = System.Console.ReadLine();
		valor = Convert.ToInt32(linea);

		// En este caso lanzamos la excepción
		if (valor < 0)
		{
			throw ( new MenorQueCero("Que cagada!") );
		}

		// En este otro caso también
		if (valor > 10)
		{
			throw ( new MayorQueDiez() );
		}

	}


	public static void Main(string[] argumentos)
	{
		Numeros numeros = new Numeros();
		int valor = 0;

		// Recogemos un valor y si salta nuestra excepción la capturamos
		System.Console.Write("Escribe un numero reina: ");
		try
		{
			numeros.recogeValor();
		}
		catch (MenorQueCero e)
		{
			System.Console.WriteLine("Me has metido algo menor que 0 {0}", e);

		}
		catch (MayorQueDiez e)
		{
			System.Console.WriteLine("Me has metido algo mayor que 10 {0}", e);
		}
		// En cualquier otro caso, capturamos y ya esta
		catch (Exception e)
		{
			System.Console.WriteLine("Pero que valor me has metido? {0}", e);
		}

		// CHECKED y UNCHECKED
		// Para cambiar el comportamiento de las excepciones podemos usar bloques checked, unchecked
		// comenta los bloques y prueba a ver que pasa
		try
		{
			// Esto hará que la excepción salte
			checked
			{
				valor = Convert.ToInt32(argumentos[0]);
			}

			// Pero esto en cambio tratará de ajustar el valor
			unchecked
			{
				valor = (int)4354243353523;
			}

		}
		catch (Exception e)
		{
			System.Console.WriteLine("Has evacuado fino en la asignación {0}", e);
		}
		finally
		{
			System.Console.WriteLine("El valor se queda en {0}", valor);
		}
	}
}