Как переопределить Catch (Exception) в методе Parent (Caller)? - PullRequest
0 голосов
/ 08 января 2020

Есть ли способ заставить вызывающую сторону переопределить catch?

, то есть

void ParentMethod()
{
  try 
  {   
      child_method(); 
  }
  catch(Exception e)
  {
      MessageBox.Show("parent");
  }
}

void child_method()
{
  try 
  {   
      smth(); 
  }
  catch(Exception e)
  {
      MessageBox.Show("child");
  }
}

, поэтому, когда smth выдает исключение, вместо "child", я мог бы переопределить это catch с родителем, и показать то есть parent.

Примечание 1: Я нахожусь в случае, когда я не контролирую child. Однако ради завершения ответа вы все равно можете ответить за случай, когда child контролируется.

Примечание 2: Я нигде не упоминал, что у меня есть классы или наследование. Пожалуйста, избегайте ответов на виртуальные / переопределить вещи. Я знаю это.

Ответы [ 3 ]

1 голос
/ 09 января 2020

Краткий ответ: нет .
Но я думаю, что вы неправильно поняли несколько вещей об объектно-ориентированном программировании.
Таким образом, вы можете переопределить метод другим методом с тем же именем и другим прототипом, если вы хочу больше конфигурации или другого поведения. Вы можете наследовать от класса и переопределить методы, чтобы разделить общую часть и настроить все, что вы хотите.

Хорошо, так что вам нужна общая часть parent, которая будет содержать раздел try catch.
Итак, у вас есть совершенно другой подход к тому, что вы делали, но если я правильно понял, вполне подходит то, что вы хотеть.

using System;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            VirtualTest test1 = new Test1();
            test1.ParentMethod();
            VirtualTest test2 = new Test1();
            test2.ParentMethod();
            Console.ReadKey();
        }
    }

    abstract class VirtualTest
    {
        public void ParentMethod()
        {
            try
            {
                ChildMethod();
            }
            catch
            {
                Console.WriteLine("parent");
            }
        }

        protected abstract void ChildMethod();
    }

    class Test1 : VirtualTest
    {
        protected override void ChildMethod()
        {
            try
            {
                throw new ArgumentException("A message");
            }
            catch (ArgumentException e)
            {
                Console.WriteLine(e.Message);
                throw; //Here is a way to handle more specificly some
                //errors but still throwing and keeping the original stacktrace
            }
        }
    }

    class Test2 : VirtualTest
    {
        protected override void ChildMethod()
        {
            throw new NotImplementedException();
        }
    }
}

В этом случае у вас также есть больший контроль над тем, что вы ловите на каком уровне, и вы можете решить, хотите ли вы справиться с этим или нет.
Чем выше уровень, с которым вы справляетесь Exception тем лучше. Также в этом примере Parents на самом деле являются родителями, а Children на самом деле являются детскими детьми в стиле POO.

1 голос
/ 09 января 2020

Если код дочернего метода также принадлежит / контролируется / имеет доступ к человеку / группе, который владеет / контролирует код для родительского метода, то вы можете сделать несколько вещей -

  1. если всегда есть родительский метод для вызова этого дочернего метода и что дочерний метод не будет сам по себе (по вашему замыслу), вы можете игнорировать try-catch в child и иметь родительский дескриптор того, что они хотят .

  2. Если (не № 1), то это правда из выше комментария .

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

1 голос
/ 09 января 2020

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

Тем не менее, способ отловить исключение в родительском методе также состоит в том, чтобы либо перебросить исходное исключение или новое исключение:

void child_method()
{
  try 
  {   
      smth(); 
  }
  catch(Exception e)
  {
      MessageBox.Show("child");
      //or: throw new Exception("Exception thrown in child");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...