如何使用TRY CATCH进行异常处理?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (129)

经常看到以下代码:

try
{
  //do something
}
catch
{
  //Do nothing
}

或者,有时他们会将日志记录信息写入日志文件,如下所示try catch

try
{
  //do some work
}
catch(Exception exception)
{
   WriteException2LogFile(exception);
}

我只是想知道他们所做的是否是最佳做法?

提问于
用户回答回答于

有3种情况使用了try-catch

  1. 总是处理已知异常尽可能低。
  2. 需要对异常执行某些操作(例如,记录或回滚事务),则重新抛出异常。
  3. 总是处理未知数异常尽可能高-应该使用异常而不是重新抛出的代码应该是UI或公共API。

假设您正在连接到一个远程API,在这里您知道预期会出现某些错误(在这些情况下也会有一些错误),下面是案例1:

try 
{
    remoteApi.Connect()
}
catch(ApiConnectionSecurityException ex) 
{
    // User's security details have expired
    return false;
}

return true;

注意,没有捕获任何其他异常,因为它们是不被期望的。

第二种情况:

try
{
    DBConnection.Save();
}
catch
{
    // Roll back the DB changes so they aren't corrupted on ANY exception
    DBConnection.Rollback();

    // Re-throw the exception, it's critical that the user knows that it failed to save
    throw;
}

请注意,我们重新抛出异常-代码更高的部分仍然需要知道什么东西失败了。

案例3的例子:

try
{
    // Do something
}
catch(Exception ex) 
{
    // Log exception for developers
    WriteException2LogFile(ex);

    // Display message to users
    DisplayWarningBox("An error has occurred, please contact support!");
}
用户回答回答于

异常处理策略是:

- For a UI application: to pop it to the user with an apology message (winforms)
- For a Service or a Console application: log it to a file (service or console)

那我总是把外部运行的每一段代码try/catch*

  • 所有由WinForms基础结构触发的事件(Load,Click,SelectedChanged...)
  • 由第三方组件触发的所有事件
- In the event log
- or in a .log file on the disk

最后:

// DON'T DO THIS, ITS BAD
try
{
    ...
}
catch 
{
   // only air...
}

没用的:

// DONT'T DO THIS, ITS USELESS
try
{
    ...
}
catch(Exception ex)
{
    throw ex;
}

最后一次尝试而没有捕获是完全有效的:

try
{
    listView1.BeginUpdate();

    // If an exception occurs in the following code, then the finally will be executed
    // and the exception will be thrown
    ...
}
finally
{
    // I WANT THIS CODE TO RUN EVENTUALLY REGARDLESS AN EXCEPTION OCCURED OR NOT
    listView1.EndUpdate();
}

我在高层代码所做的事情:

// i.e When the user clicks on a button
try
{
    ...
}
catch(Exception ex)
{
    ex.Log(); // Log exception

    -- OR --

    ex.Log().Display(); // Log exception, then show it to the user with apologies...
}

在一些所谓的函数中所做的事情:

// Calculation module
try
{
    ...
}
catch(Exception ex)
{
    // Add useful information to the exception
    throw new ApplicationException("Something wrong happened in the calculation module :", ex);
}

// IO module
try
{
    ...
}
catch(Exception ex)
{
    throw new ApplicationException(string.Format("I cannot write the file {0} to {1}", fileName, directoryName), ex);
}

异常处理(自定义异常)有很多事情要做,但我试图记住的规则对于我所做的简单应用程序来说已经足够了。

所属标签

可能回答问题的人

  • uncle_light

    5 粉丝518 提问7 回答
  • 学生

    3 粉丝476 提问7 回答
  • o o

    4 粉丝494 提问5 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券