Try/Catch -代码风格"的问题

本文关键字:quot 问题 风格 Catch 代码 Try | 更新日期: 2023-09-27 18:09:06

一般来说,我想编写一段代码,使调用一个可能抛出异常的类的Execute函数。我的问题是我是否应该设置类,我是否应该在try/catch或外面从中提取值?

选项:

neededValue V;
try
{
    MyClass C = new MyClass();
    C.SomeParam = XXX;
    C.Execute();
    V = C.SomeParam2;
}
catch
{
    //Clean up...
    //Log...
    //Throw new exception
}

选项B:

neededValue V;
MyClass C = new MyClass();
C.SomeParam = XXX;
try
{
    C.Execute();
}
catch
{
    //Clean up...
    //Log...
    //Throw new exception
}
V = C.SomeParam2;

我知道两种都可以,但是哪一种更好更容易阅读呢?

Try/Catch -代码风格"的问题

它们不是一回事,在第一种情况下,V = C.SomeParam2;将永远不会在异常情况下执行,而在第二种情况下,它将始终被执行。

更重要的是,你的catch块使用的例子是非常错误的,总是把异常对象放在catch之后,用日志框架记录发生了什么,然后反应并处理异常,如果你可以,只有在它有意义的情况下,或者抛出它,或者根本不捕获它,你的调用代码将捕获它。

我认为选项B更容易阅读,更实用,因为您稍后会知道Execute可以抛出和Exception。

它们是不一样的,在选项B中,如果你处理异常,那么你的B变量也将被设置,而不仅仅是当你的Execute成功时。

你应该总是在catch块中指定你要捕获的异常类型,这样你就可以正确地处理它和/或记录它

我觉得选项a更容易读懂。我当然也会这么做。

两个都可以。

但是如果你想在try catch块之外使用MyClass对象,请使用第二个。

MyClass对象的第一个作用域仅为try块。

所以这取决于你如何使用这两者中的一个。

我认为你应该在你的try块中包含所有与你试图完成的小任务有关的代码。然而,有时您需要在进入try块之前定义某些变量。例如,您总是希望在try块之前定义InputStreams和OutputStreams,以便您可以在finally块中关闭它们。

这基本上取决于一个问题。如果Execute方法失败并抛出异常,您希望V被分配C.SomeParam2的值吗?

如果你不想让它失败时被分配,选择A,如果你想让它被分配,不管Execute结果如何,选择b。