Кто должен зарегистрировать ошибку/исключение

Я знаю многих людей как я, которые все еще используют сппн / Usenet ежедневно. Это - абсолютно неоценимый инструмент. Я сомневаюсь, что это уйдет в ближайшее время.

Это похоже на автомат для игры в пинбол онлайн-сообществ. Все новые дети не могут знать то, о чем это - все и может думать, что это мертво, но это является все еще живым и здоровым и нет все еще ничего, что может выдержать сравнение.

5
задан Noam Gal 13 August 2009 в 12:53
поделиться

4 ответа

В основном вам следует избегать регистрации его как в перехвате нижнего, так и на более высоком уровне, поскольку это приводит к раздутию журнала избыточной информацией (не говоря уже о дополнительных ресурсах ввода-вывода для записи в журнал).

Если вам нужна общая информация о передовых методах обработки исключений, эта ссылка удобна .

6
ответ дан 14 December 2019 в 01:13
поделиться

В моих приложениях 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");
0
ответ дан 14 December 2019 в 01:13
поделиться

Вы можете обойтись без регистрации только один раз на самом верхнем уровне вашего приложения, пока ваш код регистрации (а) регистрирует трассировку стека исключения и (б) регистрирует целую цепочку внутренних исключений.

Блок приложения обработки исключений Microsoft позаботится обо всем этом за вас. Я предполагаю, что другие структуры ведения журнала поступят так же.

4
ответ дан 14 December 2019 в 01:13
поделиться

лог где ловишь, если заворачиваешь то надо. Если нижняя оболочка этого не делает, у вас есть причина (для возможности отладки) сделать это. Однако не проглатывайте исключение, если вы не знаете, что оно неопасно или не можете с ним справиться.

Я бы посоветовал

try{
.
.
.
} catch(Exception ex){
 ... log ....
 throw;
}

, если вам нужно зарегистрировать и передать исключение.

-1
ответ дан 14 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: