C#正确的异常处理

时间:2018-11-03 00:33:32

标签: c# exception-handling

我目前有一个具有以下示例代码路径的应用。

    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}");
            }
        }
    }

问题是我正在尝试处理functionB catch块中的错误。

但是,如果通过函数B或在函数B中执行的调用库中引发了异常,则错误将在函数A catch块中结束;所以我在功能B捕获中拥有的处理代码似乎被跳过了,尽管在进入功能B捕获时却进入了log.error ...然后退回到功能A且日志中没有打印出来自B的消息吗?

为了处理该功能并继续执行流程,我在这里缺少什么?

非常感谢

编辑: 根据评论,在FunctionB中添加了以下行:

log.Info("Testing123");

输出:

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

所以看来日志正确实现了..:(

3 个答案:

答案 0 :(得分:2)

您的log似乎没有初始化,我不确定您使用的是哪个库,但是您没有正确地实例化log及其最可能的实例null

根据框架,应该对每个类进行DI或静态更新

答案 1 :(得分:1)

问题似乎是这行,我没有添加到示例中,因为我没有怀疑它:

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

似乎InnerException.Message是此问题的根本原因,所以最终导致了空引用错误,然后将其传递回functionA。由于以前的测试中发现了根本问题,因此我从以前的测试中获取了此信息。内部异常,所以至少现在我从中学到了,也可以为此添加处理程序。

我感谢TheGeneral的帮助,因为它使我更加仔细地了解了实施情况。

感谢所有。

答案 2 :(得分:-3)

轻松^^

try
    {
        //...
    }
    catch(Exception ex)
    {
        //Handle a Exception
        throw new Exception("My Exeception Message");
    }