如果发生异常,则退出函数/方法

问题描述 投票:1回答:2

如果在sub方法中发生异常,我正在尝试找到退出整个方法的代码。我尝试在Subfunction()的catch部分添加return但是进程将继续到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()。任何帮助将受到高度赞赏。谢谢

c# asp.net exception
2个回答
2
投票

基本上有两组可能的解决方案:使用Exceptions和不使用。

使用例外,我建议让它冒出来,正如我在评论中已经说过的那样。

然后你可以重新抛出:

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

你可以包装:

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

BTW:捕获异常通常不是一个好主意。大多数情况下,您希望捕获可以实际处理的特定异常。


另一类解决方案没有冒出异常:

返回值:

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”,您可能会偶然发现这一点。 (没有冒犯 - 只是我的经验)

或者使用状态对象......

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

请注意,我绝不会鼓励使用后者。但它有可能......并且OP要求可能性。

免责声明:所有代码段未经测试。谁发现错误可以保留它们(但请写评论,以便我可以修复它们)。


3
投票

如果Subfuntion()中发生错误,我想从Mainfunction()中停止进程

在方法Subfunction中删除try / catch的最简单方法

如果你想在这个方法中保留try / catch,(对于日志记录或其他东西),重新抛出异常

    public static void Main()
    {
        try
        {           
            Subfunction();
            Thirdfunction();
        }
        catch(Exception ex)
        {
        }
    }    
    public static void Subfunction()
    {
        try
        {
            throw new AccessViolationException();
        }
        catch (Exception ex)
        {
            throw;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.