Exception

try
{
  var streamRead = new SteamReader("");
}
catch (DividedByZeroException ex) // The most specific exception
{
  // TODO
}
catch (Exception ex) // The most generic exception
{
  // TODO
}
finally
{
  streamReader.Dispose();
}

In C#, some classes are not managed by CLR. We need to dispose them manually in finally.

These classes are usually related to files, database connection, network connection, etc.

using keyword

using in the C# will create a finally block under the hood, which will call the dispose() automatically

try
{
  using (var streamRead = new SteamReader(""))
  {
    var content = streamRead.ReadToEnd();
  }
}
catch (Exception ex)
{
  // TODO
}

Custom Exception

public class CustomException : Exception
{
  public CustomException(string message, Exception innerException)
    : base(message, innerException)
  {}
}