System.IO
is all you need :)
As regards exception handling. Unless we are expecting an exception, we should never catch it. Truly unexpected exceptions should go unhandled. [looks guilty] ok, the only exception is at the highest level, and only for reporting purposes, such as
// assuming console program, but every application Console, WinForm,
// Wpf, WindowsService, WebService, WcfService has a similar entry point
class Program
{
// assume log4net logging here, but could as easily be
// Console.WriteLine, or hand rolled logger
private static readonly ILog _log = LogManager.GetLogger (typeof (Program));
static void Main (string[] args)
{
AppDomain.CurrentDomain.UnhandledException +=
CurrentDomain_UnhandledException;
}
private static void CurrentDomain_UnhandledException (
object sender,
UnhandledExceptionEventArgs e)
{
_log.
Fatal (
string.Format (
"Unhandled exception caught by " +
"'CurrentDomain_UnhandledException'. Terminating program.",
e.ExceptionObject);
}
}
If you are expecting an exception then one of the following is acceptable
// example of first option. this applies ONLY when there is a
// well-defined negative path or recovery scenario
public void SomeFunction ()
{
try
{
string allText = System.IO.File.ReadAllText ();
}
// catch ONLY those exceptions you expect
catch (System.ArgumentException e)
{
// ALWAYS log an error, expected or otherwise.
_log.Warn ("Argument exception in SomeFunction", e);
// if the use-case\control flow is recoverable, invoke
// recovery logic, preferably out of try-catch scope
}
}
or
// example of second option. this applies ONLY when there is no
// well defined negative path and we require additional information
// on failure
public void SomeFunction ()
{
try
{
string allText = System.IO.File.ReadAllText ();
}
// catch ONLY those exceptions you expect
catch (System.ArgumentException innerException)
{
// do whatever you need to do to identify this
// problem area and provide additional context
// like parameters or what have you. ALWAYS
// provide inner exception
throw new SomeCustomException (
"some new message with extra info.",
maybeSomeAdditionalContext,
innerException);
// no requirement to log, assume caller will
// handle appropriately
}
}