// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ExceptionExtensions.cs" company="Catel development team">
// Copyright (c) 2008 - 2011 Catel development team. All rights reserved.
// </copyright>
// <summary>
// Exception helper class.
// </summary>
// --------------------------------------------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Globalization;
namespace Catel.Diagnostics
{
/// <summary>
/// Exception helper class.
/// </summary>
public static class ExceptionExtensions
{
/// <summary>
/// Traces an error message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="message">Message of the trace.</param>
public static void TraceExceptionAsError(this Exception ex, string message)
{
TraceException(ex, TraceLevel.Error, message, new object[] { });
}
/// <summary>
/// Traces an error message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="format">A format string that contains zero or more format items, which correspond to objects in the args array.</param>
/// <param name="args">An object array containing zero or more objects to format.</param>
public static void TraceExceptionAsError(this Exception ex, string format, params object[] args)
{
TraceException(ex, TraceLevel.Error, format, args);
}
/// <summary>
/// Traces a warning message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="message">Message of the trace.</param>
public static void TraceExceptionAsWarning(this Exception ex, string message)
{
TraceException(ex, TraceLevel.Warning, message, new object[] { });
}
/// <summary>
/// Traces a warning message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="format">A format string that contains zero or more format items, which correspond to objects in the args array.</param>
/// <param name="args">An object array containing zero or more objects to format.</param>
public static void TraceExceptionAsWarning(this Exception ex, string format, params object[] args)
{
TraceException(ex, TraceLevel.Warning, format, args);
}
/// <summary>
/// Traces an information message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="message">Message of the trace.</param>
public static void TraceExceptionAsInformation(this Exception ex, string message)
{
TraceException(ex, TraceLevel.Info, message, new object[] { });
}
/// <summary>
/// Traces an information message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="format">A format string that contains zero or more format items, which correspond to objects in the args array.</param>
/// <param name="args">An object array containing zero or more objects to format.</param>
public static void TraceExceptionAsInformation(this Exception ex, string format, params object[] args)
{
TraceException(ex, TraceLevel.Info, format, args);
}
/// <summary>
/// Traces a verbose message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="message">Message of the trace.</param>
public static void TraceExceptionAsVerbose(this Exception ex, string message)
{
TraceException(ex, TraceLevel.Verbose, message, new object[] { });
}
/// <summary>
/// Traces a verbose message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="format">A format string that contains zero or more format items, which correspond to objects in the args array.</param>
/// <param name="args">An object array containing zero or more objects to format.</param>
public static void TraceExceptionAsVerbose(this Exception ex, string format, params object[] args)
{
TraceException(ex, TraceLevel.Verbose, format, args);
}
/// <summary>
/// Traces a message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="level"><see cref="TraceLevel"/> to write.</param>
/// <param name="message">Message of the trace.</param>
public static void TraceException(this Exception ex, TraceLevel level, string message)
{
TraceException(ex, level, message, new object[] { });
}
/// <summary>
/// Traces a message with exception details.
/// </summary>
/// <param name="ex"><see cref="Exception"/> that contains the additional information.</param>
/// <param name="level"><see cref="TraceLevel"/> to write.</param>
/// <param name="format">A format string that contains zero or more format items, which correspond to objects in the args array.</param>
/// <param name="args">An object array containing zero or more objects to format.</param>
public static void TraceException(this Exception ex, TraceLevel level, string format, params object[] args)
{
string message = (args.Length == 0) ? format : string.Format(CultureInfo.CurrentUICulture, format, args);
string deepestExceptionMessage = ex.InnerException != null ? GetInnerException(ex).Message : "null";
string finalMessage = string.Format("{0} -------------> (Details: '{1}' | InnerException: {2})", message, ex.Message, deepestExceptionMessage);
TraceHelper.TraceWithDetails(level, finalMessage, ex.ToString());
}
/// <summary>
/// Gets the inner exception.
/// </summary>
/// <param name="ex">The exception.</param>
/// <returns>Inner exception of the exception. If no inner exception is available, the actual exception is returned.</returns>
private static Exception GetInnerException(Exception ex)
{
return (ex.InnerException != null) ? GetInnerException(ex.InnerException) : ex;
}
}
}