C # правильная обработка исключений - PullRequest
0 голосов
/ 03 ноября 2018

В настоящее время у меня есть приложение, которое имеет следующий пример кода пути.

    class A
    { 
        private readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(A));
        public void FunctionA()
        {
            try
            {
                B test = new B();
                test.FunctionB();
            }
            catch (Exception ex)
            {
                //handle error ends up here but message is null ref error?
                log.error(ex.Message);
            }
        }
    }
    class B
    {
        private readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(B));
        public void FunctionB()
        {
            try
            {
                //here a custom library function is called that
                //That handles serialized xml data
                //that also has a try catch
            }
            catch (Exception ex)
            {
                //handle error correct error is lost as it falls back to Class A functionA
                log.Error($"Error Encountered During Data operation: {SPID_EX.Message}, \r\n\r\nInner Exception:  {SPID_EX.InnerException.Message}");
            }
        }
    }

Проблема в том, что я пытаюсь обработать ошибку в блоке перехвата функции B.

Однако, если исключение возникает в вызываемой библиотеке через функцию B или во время выполнения в функции B, ошибка заканчивается в блоке перехвата функции A; поэтому код обработки, который у меня есть в функции B catch, кажется пропущенным, хотя при переходе через него он входит в функцию B catch и достигает log.error ... затем возвращается к функции A и в журналах не выводится сообщение от B?

Что мне здесь не хватает, чтобы обработать функцию и продолжить выполнение?

Большое спасибо

EDIT: Добавлена ​​следующая строка в FunctionB на основе комментариев:

log.Info("Testing123");

вывод:

2018-11-03 01:04:09,361 INFO - Testing123

кажется, что журнал реализован правильно ..: (

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Легко ^^

try
    {
        //...
    }
    catch(Exception ex)
    {
        //Handle a Exception
        throw new Exception("My Exeception Message");
    }
0 голосов
/ 03 ноября 2018

Кажется, проблема была в этой строке, которую я не смог добавить в пример, так как не подозревал:

log.Error($"Error Encountered During Data operation: {SPID_EX.Message}, \r\n\r\nInner Exception:  {SPID_EX.InnerException.Message}");

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

Я ценю помощь от TheGeneral, так как она заставила меня присмотреться к реализации.

Ценю всех.

0 голосов
/ 03 ноября 2018

Кажется, ваш log не инициализирован, я не уверен, какую библиотеку вы используете, однако вы неправильно создаете экземпляр log, и, скорее всего, null.

Возможно, это должно быть включено или статически обновлено для каждого класса в зависимости от структуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...