C# 使用Try-Catch-Finally处理算术异常

C# 使用Try-Catch-Finally处理算术异常,c#,error-handling,try-catch-finally,C#,Error Handling,Try Catch Finally,我想尝试两种不同的方法(都有很强的失败可能性),因此我想使用“finally”语句运行“safety”,以防前两次尝试都失败 以下面的例子(不,这不是我在项目中使用的代码!) 因此,我想让我的程序执行以下操作: 试图除以零 如果步骤#1失败,我想让“catch”语句运行它的代码(在本例中应该再次失败) 如果步骤1和步骤2都失败,我希望我的程序在“finally”语句中显示消息框 我和这个很接近吗?你所做的一切都会奏效。但请注意,在finally块中显示消息后,异常将重新抛出。您所做的将起作用。但

我想尝试两种不同的方法(都有很强的失败可能性),因此我想使用“finally”语句运行“safety”,以防前两次尝试都失败

以下面的例子(不,这不是我在项目中使用的代码!)

因此,我想让我的程序执行以下操作:

  • 试图除以零
  • 如果步骤#1失败,我想让“catch”语句运行它的代码(在本例中应该再次失败)
  • 如果步骤1和步骤2都失败,我希望我的程序在“finally”语句中显示消息框

  • 我和这个很接近吗?

    你所做的一切都会奏效。但请注意,在finally块中显示消息后,异常将重新抛出。

    您所做的将起作用。但是请注意,在finally块中显示的消息之后,异常将重新抛出。

    在测试实践中,您不应在catch中放置可能失败的代码

    对于您的样本,您应该使用嵌套的try catch finally

                int zero = 0;              
                int one = 1;
                bool flag=false;                
                try              
                {     
                    try
                    {
                        int error = one / zero; 
                    }
                    catch
                    {
                        flag=false;
                    }
                    if(flag==false)               
                       int error = one / zero;              
                }                
                catch              
                {                  
                    MessageBox.Show("I can never make it here ...");        
                } 
    

    使用finally部分释放您的资源,当您想在try或catch之后执行代码时,您的代码将100%执行。

    在最佳实践中,您不应将代码放置在可能失败的catch

    int zero = 0;
    int one = 1;
    
    try {
        try
        {
            // Throws ' cannot divide by zero ' error
            int error = one / zero;
        }
    
        catch (DivideByZeroException)
        {
            // Throws error again of course
            int somenum = one / zero;
        }
    }
    catch (DivideByZeroException)
    {
        MessageBox.Show("I can never make it here ...");
    }
    
    对于您的样本,您应该使用嵌套的try catch finally

                int zero = 0;              
                int one = 1;
                bool flag=false;                
                try              
                {     
                    try
                    {
                        int error = one / zero; 
                    }
                    catch
                    {
                        flag=false;
                    }
                    if(flag==false)               
                       int error = one / zero;              
                }                
                catch              
                {                  
                    MessageBox.Show("I can never make it here ...");        
                } 
    

    使用finally部分免费获取资源,当您想在尝试或捕获后执行代码时,您的代码将100%执行。

    根据我的经验,您似乎需要在第一个捕获中再尝试一次:

    int zero = 0;
    int one = 1;
    
    try {
        try
        {
            // Throws ' cannot divide by zero ' error
            int error = one / zero;
        }
    
        catch (DivideByZeroException)
        {
            // Throws error again of course
            int somenum = one / zero;
        }
    }
    catch (DivideByZeroException)
    {
        MessageBox.Show("I can never make it here ...");
    }
    
            int zero = 0;
            int one = 1;
    
            try
            {
                // Throws ' cannot divide by zero ' error
                int error = one / zero;
            }
    
            catch
            {
                try
                {
                     // Throws error again of course
                     int somenum = one / zero;
                }
                catch { }
            }
    
            finally 
            {
                MessageBox.Show("I can never make it here ..."); 
            }
    

    根据我的经验,似乎您需要在第一次捕获中再进行一次尝试:

            int zero = 0;
            int one = 1;
    
            try
            {
                // Throws ' cannot divide by zero ' error
                int error = one / zero;
            }
    
            catch
            {
                try
                {
                     // Throws error again of course
                     int somenum = one / zero;
                }
                catch { }
            }
    
            finally 
            {
                MessageBox.Show("I can never make it here ..."); 
            }
    

    这是因为您在
    catch
    块上生成了一个异常,而没有处理它

    try
    {
        int error = one / zero; // throws an exception
    }
    catch // catches
    {
        int somenum = one / zero; // throws again
    }
    // no code to handle the exception
    // application crashes
    

    您可以避免放置嵌套的
    try catch
    块。

    原因是您在
    catch
    块上生成了一个异常,并且没有处理它

    try
    {
        int error = one / zero; // throws an exception
    }
    catch // catches
    {
        int somenum = one / zero; // throws again
    }
    // no code to handle the exception
    // application crashes
    

    您可以避免放置嵌套的
    try catch
    块。

    但是我的代码永远不会到达finally扇区。在catch块中抛出第二个异常后,程序就停止了。@Evan:不,您的应用程序正在到达那里,但您没有注意到它。为了证明从资源管理器而不是从VS运行exe文件,我的代码永远不会到达最终扇区。在catch块中抛出第二个异常后,程序就停止了。@Evan:不,您的应用程序正在到达那里,但您没有注意到它。为了证明从资源管理器而不是从VS运行exe文件,请知道
    最终
    运行的方式是成功还是失败。这不像是第二次尝试捕获,它只会运行(除非整个过程都停止)。要知道,
    最终
    会以成功或失败的方式运行。这不像是第二次尝试捕获
    错误,它只会运行(除非整个过程都被关闭)。一个诡辩:你应该捕获一个特定的错误。捕获包括threadabort和outofmemory在内的所有内容都是一个糟糕的想法一个诡辩:您应该捕获一个特定的错误。捕获包括threadabort和outofmemory在内的所有内容是个坏主意