代码之家  ›  专栏  ›  技术社区  ›  CocoaMix86

处理来自多个方法的异常

  •  0
  • CocoaMix86  · 技术社区  · 5 年前

    我有一个这样的方法

    private void Foo()
    {
       Method1(var1)
       Method2(var1)
       Method3(var2)
       Method4(var3)
       ...
       //lots of methods in a row like this
    }
    

    我如何在它调用的每个方法上实现异常处理,而不到处乱发try-catch块?我希望根据导致异常的方法,异常消息会有所不同。

    例子:
    Method1() 中断:显示用户 "You don't have permissions for this"
    Method2() 中断:显示用户 "File contents are not in the right format"
    Method3() 中断:显示用户 "Error at line 3 in file"

    4 回复  |  直到 5 年前
        1
  •  3
  •   TheGeneral    5 年前

    一种技术含量很低的方法也许只是使用 行动代表 使用一个泛型参数,至少按期望得到的异常进行筛选

    public void Check<T>(Action action, string errorMessage ) where T : Exception
    {
       try
       {
          action();
       }
       catch (Exception e) when (e is T)
       {
          ShowMessage(errorMessage);
       }
    }
    

    用法

    Check<IndexOutOfRangeException>(() => Method1(), "oh darn");
    

    但就我个人而言,我认为这是一个相当可疑的解决方案,您可能应该全面重新考虑异常处理策略。简而言之,异常不应该用于流控制,而捕获它们应该在您确切知道如何处理它们时进行。

    此外,如果方法实现可用,那么它们可能应该使用Try风格的方法,或者只在它知道需要它们的时候捕获并处理它们自己的异常。

        2
  •  1
  •   Maytham Fahmi    5 年前

    您可以做的是创建一个异常列表,并将所有异常添加到该列表中。

    在系统结束时,收集所有异常。

    你的例子就是这样。

    private List<Exception> Exceptions = new List<Exception>();
    

    而不是你所做的每一种方法:

    void Method1(string var1)
    {
        try
        {
            //some logic
        }
        catch (Exception e)
        {
            Exceptions.Add(e);
        }
    }
    

    您还可以创建自己的错误模型,该模型具有异常属性和其他属性,如时间、消息等。

    为了立即显示问题,你可以在最后做一个循环,比如:

    foreach (var exception in Exceptions)
    {
        Console.WriteLine(exception.Message);
    }
    
        3
  •  -1
  •   shalitha anuradha    5 年前

    您可以在每个方法中抛出已识别的异常,如下所示,在这些方法实现的定义行中。

        public void Method1() throws NoPermissionException{
        
        }
        
        public void Method2() throws IllegalFormatException {
        
        }
        
        public void Method3() throws ArithmeticException{
        
        }
    

    然后在Foo()方法中编写一个try块和相关的catch子句,以便在代码的一个位置捕获每个异常,如下所示。

        private void Foo()
    {
       try{
          Method1(var1);
          Method2(var1);
          Method3(var2);
          Method4(var3);
       catch(NoPermissionException e){
          e.printStackTrace();
       }
       catch(IllegalFormatException e){
          e.printStackTrace();
       }
       catch(ArithmeticException){
          e.printStackTrace();
       }
       
       ...
       //lots of methods in a row like this
    }
    
        4
  •  -1
  •   Alen Smith    5 年前

    如果基于某些条件(已处理的异常)显式抛出新异常,则不需要通过放置try-catch语句到处发送垃圾邮件。

            private void Foo()
            {
                try
                {
                    Method1(var1);
                    Method2(var1);
                    Method3(var2);
                    Method4(var3);
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }           
            }
    
            private void Method4(object var3)
            {
                throw new Exception("Exception A");
            }
    
            private void Method3(object var2)
            {
                throw new Exception("Exception B");
            }
    
            private void Method2(object var1)
            {
                throw new Exception("Exception C");
            }
    
            private void Method1(object var1)
            {
                throw new Exception("Exception D");
            }
    
    推荐文章