Я знаю многих людей как я, которые все еще используют сппн / Usenet ежедневно. Это - абсолютно неоценимый инструмент. Я сомневаюсь, что это уйдет в ближайшее время.
Это похоже на автомат для игры в пинбол онлайн-сообществ. Все новые дети не могут знать то, о чем это - все и может думать, что это мертво, но это является все еще живым и здоровым и нет все еще ничего, что может выдержать сравнение.
В основном вам следует избегать регистрации его как в перехвате нижнего, так и на более высоком уровне, поскольку это приводит к раздутию журнала избыточной информацией (не говоря уже о дополнительных ресурсах ввода-вывода для записи в журнал).
Если вам нужна общая информация о передовых методах обработки исключений, эта ссылка удобна .
В моих приложениях winform я создал некоторый Observer для ведения журнала. У Observer есть подписчики, которые могут куда-то писать лог или обрабатывать его. Это выглядит:
public static class LoggingObserver
{
/// <summary>
/// Last getted log message
/// </summary>
public static string LastLog;
/// <summary>
/// Last getted exception
/// </summary>
public static Exception LastException;
/// <summary>
/// List of log's processors
/// </summary>
public static List<BaseLogging> loggings = new List<BaseLogging>();
/// <summary>
/// Get Exception and send for log's processors
/// </summary>
/// <param name="ex">Exception with message</param>
public static void AddLogs(Exception ex)
{
LastException = ex;
LastLog = string.Empty;
foreach (BaseLogging logs in loggings)
{
logs.AddLogs(ex);
}
}
/// <summary>
/// Get message log for log's processors
/// </summary>
/// <param name="str">Message log</param>
public static void AddLogs(string str)
{
LastException = null;
LastLog = str;
foreach (BaseLogging logs in loggings)
{
logs.AddLogs(str);
}
}
/// <summary>
/// Close all processors
/// </summary>
public static void Close()
{
foreach (BaseLogging logs in loggings)
{
logs.Close();
}
}
}
Абстрактный класс подписчика:
public abstract class BaseLogging
{
/// <summary>
/// Culture (using for date)
/// </summary>
public CultureInfo culture;
/// <summary>
/// Constructor
/// </summary>
/// <param name="culture">Culture</param>
public BaseLogging(CultureInfo culture)
{
this.culture = culture;
}
/// <summary>
/// Add log in log system
/// </summary>
/// <param name="str">message of log</param>
public virtual void AddLogs(string str)
{
DateTime dt = DateTime.Now;
string dts = Convert.ToString(dt, culture.DateTimeFormat);
WriteLine(String.Format("{0} : {1}", dts, str));
}
/// <summary>
/// Add log in log system
/// </summary>
/// <param name="ex">Exception</param>
public virtual void AddLogs(Exception ex)
{
DateTime dt = DateTime.Now;
string dts = Convert.ToString(dt, culture.DateTimeFormat);
WriteException(ex);
}
/// <summary>
/// Write string on log system processor
/// </summary>
/// <param name="str">logs message</param>
protected abstract void WriteLine(string str);
/// <summary>
/// Write string on log system processor
/// </summary>
/// <param name="ex">Exception</param>
protected abstract void WriteException(Exception ex);
/// <summary>
/// Close log system (file, stream, etc...)
/// </summary>
public abstract void Close();
}
И реализация для записи в файл:
/// <summary>
/// Logger processor, which write log to some stream
/// </summary>
public class LoggingStream : BaseLogging
{
private Stream stream;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="stream">Initialized stream</param>
/// <param name="culture">Culture of log system</param>
public LoggingStream (Stream stream, CultureInfo culture)
: base(culture)
{
this.stream = stream;
}
/// <summary>
/// Write message log to stream
/// </summary>
/// <param name="str">Message log</param>
protected override void WriteLine(string str)
{
try
{
byte[] bytes;
bytes = Encoding.ASCII.GetBytes(str + "\n");
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
}
catch { }
}
/// <summary>
/// Write Exception to stream
/// </summary>
/// <param name="ex">Log's Exception</param>
protected override void WriteException(Exception ex)
{
DateTime dt = DateTime.Now;
string dts = Convert.ToString(dt, culture.DateTimeFormat);
string message = String.Format("{0} : Exception : {1}", dts, ex.Message);
if (ex.InnerException != null)
{
message = "Error : " + AddInnerEx(ex.InnerException, message);
}
WriteLine(message);
}
/// <summary>
/// Closing stream
/// </summary>
public override void Close()
{
stream.Close();
}
private string AddInnerEx(Exception exception, string message)
{
message += "\nInner Exception : " + exception.Message;
if (exception.InnerException != null)
{
message = AddInnerEx(exception.InnerException, message);
}
return message;
}
}
Использование:
//initialization
FileStream FS = new FileStream(LogFilePath, FileMode.Create);
LoggingObserver.loggings.Add(new LoggingStream(FS, Thread.CurrentThread.CurrentCulture));
//write exception
catch (Exception ex) {
LoggingObserver.AddLog(new Exception ("Exception message", ex));
}
//write log
LoggingObserver.AddLog("Just a log");
Вы можете обойтись без регистрации только один раз на самом верхнем уровне вашего приложения, пока ваш код регистрации (а) регистрирует трассировку стека исключения и (б) регистрирует целую цепочку внутренних исключений.
Блок приложения обработки исключений Microsoft позаботится обо всем этом за вас. Я предполагаю, что другие структуры ведения журнала поступят так же.
лог где ловишь, если заворачиваешь то надо. Если нижняя оболочка этого не делает, у вас есть причина (для возможности отладки) сделать это. Однако не проглатывайте исключение, если вы не знаете, что оно неопасно или не можете с ним справиться.
Я бы посоветовал
try{
.
.
.
} catch(Exception ex){
... log ....
throw;
}
, если вам нужно зарегистрировать и передать исключение.