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

本文关键字:异常 处理 Try-Catch Finally 使用 | 更新日期: 2023-09-27 18:00:51

我想尝试两种不同的方法(都有很强的失败可能性(,因此我想使用"finally"语句来运行"安全",以防前两次尝试都失败。

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

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

所以,我想让我的程序做以下事情:

  1. 尝试除以零
  2. 如果步骤#1失败,我希望"catch"语句运行其代码(在本例中应该再次失败(
  3. 如果步骤#1和步骤#2都失败,我希望我的程序在"finally"语句中显示MessageBox

我和这个接近吗?

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

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 ..."); 
        }

原因是您在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-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%执行。

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