using System;
using System.Collections.Generic;
namespace Sarand.Net.Standard.Base.Utils
{
//=======================================================================
public static class ExceptionUtil
{
//-------------------------------------------------------------------
///
/// Extract and cleanse exception message.
/// - \r\n replaced with \n
/// - Duplicate lines removed.
///
public static String GetMessage(this Exception exc)
{
List messageLines = new List();
foreach (String messageLine in (StringUtil.EmptyOnNull(exc?.Message) ?? "").Trim().ReplaceAll("\r\n", "\n").Split('\n'))
{
if (!messageLines.ContainsCI(messageLine))
messageLines.Add(messageLine);
}
return messageLines.Concat("\n");
}
//-------------------------------------------------------------------
///
/// Generate standard exception log message.
/// [ExceptionType]: [ExceptionMessage]
/// followed by stack entries on separate lines.
///
public static String GetErrorStateMessage(this Exception exc, bool includeExceptionType = true)
{
return (includeExceptionType ? exc.GetType().Name + ": " : "") + GetMessage(exc);
}
//-------------------------------------------------------------------
///
/// Generate standard exception log message.
/// [ExceptionType]: [ExceptionMessage]
/// followed by stack entries on separate lines.
///
public static String GetLogMessage(this Exception exc, int entries = 8, String stackEntryDelim = "\n\t")
{
return exc.GetLogMessage("", entries, stackEntryDelim);
}
///
/// Generate standard exception log message.
/// [ExceptionType] [message]: [ExceptionMessage]
/// followed by stack entries on separate lines.
///
public static String GetLogMessage(this Exception exc, String message, int entries = 8, String stackEntryDelim = "\n\t")
{
return (exc.GetType().Name + " " + message + ": " + GetMessage(exc) + exc.GetStackEntries(entries).Concat("", stackEntryDelim)).TrimAll();
}
//-------------------------------------------------------------------
/// Retrieve stack entries, up to maximum number.
public static List GetStackEntries(this Exception exc, int entries = 0)
{
List stackEntries = new List();
stackEntries.AddRange(exc.StackTrace.Split(new String[] { "\r\n" }, (entries > 0 ? entries : 999), StringSplitOptions.None));
for (int idx = 0; idx < stackEntries.Count; idx++)
stackEntries[idx] = stackEntries[idx].Replace(" at ", "");
return stackEntries;
}
//-------------------------------------------------------------------
}
//=======================================================================
// File handling exceptions.
public class FileException : Exception
{
public FileException(string message) :
base(message)
{ }
}
public class ArchiveFileException : FileException
{
public ArchiveFileException(string message) :
base(message)
{ }
}
public class FileExistsException : FileException
{
public FileExistsException(string message) :
base(message)
{ }
}
//=======================================================================
}