Выйдите из функции / метода, если возникает исключение - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь найти код для выхода из всего метода, если в под-методе возникает исключение. Я попытался добавить return в секции catch Subfunction (), но процесс продолжится до Thirdfunction ()

 public static void Mainfunction()
    {
        try
        {
            //some code
            //some code
            Subfunction();
            ThirdFunction();

        }
        catch(Exception ex)
        {
            //write to log
        }
    }

    public static void Subfunction()
    {
        try
        {
            //some code
            //some code

        }
        catch (Exception ex)
        {
            //write to log
        }
    }

Таким образом, в основном, если в Subfuntion () произошла ошибка, я хочу остановить процесс из Mainfunction (), не переходя к ThirdFunction (). Любая помощь будет высоко оценена. Спасибо

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Существует в основном два набора возможных решений: с использованием исключений и без.

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

Тогда вы можете сбросить:

try {
   // exception here
}
catch(Exception ex)
{
   throw;
}

Вы можете обернуть:

try {
   // exception here
}
catch(Exception inner)
{
   throw new MyCustomException( "Some custom message", inner);
}

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


Другой класс решений без исключений:

Возвращаемое значение:

public static bool Subfunction()
{
    bool success = true;

    try
    {
        //some code
        //some code

    }
    catch (Exception ex)
    {
        success = false;
    }
    return success;
}

или

private static readonly int DONOTUSEMAGICNUMBERS = 1;
public static int Subfunction()
{
    int success = 0;

    try
    {
        //some code
        //some code

    }
    catch (Exception ex)
    {
        success = DONOTUSEMAGICNUMBERS;
    }
    return success;
}

Особенно с "C-Guys" в команде, вы можете наткнуться на это. (Без обид - только мой опыт) * ​​1026 *

Или с государственным объектом ...

public static void Mainfunction()
{
    try
    {
        //some code
        //some code
        ISuccessIndicator success = new ISIImplementation();
        Subfunction( success );
        if( !succes.HasException ) 
        {
            ThirdFunction();
        }

    }
    catch(Exception ex)
    {
        //write to log
    }
}


public static void Subfunction( ISuccessIndicator result )
{
    try
    {
        //some code
        //some code

    }
    catch (Exception ex)
    {
        result.HasException=true;
        result.Exception = ex;
    }
}


public interface ISuccessIndicator 
{
    Exception Exception {get; set;}
    bool HasException {get; set;}
}

И если вы действительно сумасшедший, вы могли бы ...

public static void Mainfunction()
{
    try
    {
        //some code
        //some code
        Exception ex = null;
        Subfunction( ref ex );
        if( ex == null ) 
        {
            ThirdFunction();
        }

    }
    catch(Exception ex)
    {
        //write to log
    }
}


public static void Subfunction( ref Exception outEx )
{
    try
    {
        //some code
        //some code

    }
    catch (Exception ex)
    {
        outEx = ex;
    }
}

Пожалуйста, обратите внимание, что я никоим образом не рекомендовал бы использовать последнее. Но это возможно ... и ОП запросил возможности.

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

0 голосов
/ 07 сентября 2018

если в Subfuntion () произошла ошибка, я хочу остановить процесс от главной функции ()

Самый простой способ удалить try / catch в вашем методе Subfunction

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

    public static void Main()
    {
        try
        {           
            Subfunction();
            Thirdfunction();
        }
        catch(Exception ex)
        {
        }
    }    
    public static void Subfunction()
    {
        try
        {
            throw new AccessViolationException();
        }
        catch (Exception ex)
        {
            throw;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...