如何强制使用Try / Catch围绕特定方法

时间:2013-12-03 14:37:44

标签: c# exception attributes try-catch

我正在创建一个“Common”库,供其他团队成员在各种解决方案项目中使用。这些方法通常是void函数,没有实际的返回数据。

我正在寻找一个为什么强迫其他人在Try...Catch块内使用这些方法。我需要确保错误得到妥善处理。我虽然依赖布尔返回类型,但也不允许我返回错误消息,所以我唯一的选择是抛出Exception

如果无法进行适当的强制,如何在编译时弹出一个属性以警告开发人员有关Try / Catch的要求? (Obsolete属性的排序。)

还有其他更好的方法吗?

修改

以下是我的完整情景:

我有一个调用Web服务的代码方法来远程更新值。更新非常重要。它自己运行的方法很好,但如果无法访问Web服务怎么办?该调用不会返回任何值。

3 个答案:

答案 0 :(得分:9)

将某些内容置于try / catch块内并不会使其“正确处理” - 实际上,在绝大多数的情况下,正确的处理方式一个例外是让它冒泡到一个新的水平。警告:try / finally更常见,允许资源清理,但更常见的是using

您无法强制执行“并且必须正确使用”代码;这在任何API中是隐含的,你只会引起烦恼和烦恼,并迫使人们进入不合适且无益的编码风格,同时给你一个完全人为的和不正确的代码正确的感觉。 / p>

如果您想确保代码正常运行:测试它。

您无法在此方案中使用任何属性。您可以创建一个FxCop规则或类似规则,但由于上述原因:我不推荐它。

答案 1 :(得分:2)

我实际上不会这样做,但作为所述问题的有趣解决方案,您可以构建自己的异常类型:SuccessException。然后,在方法结束时抛出此异常以指示成功。这使得该方法在没有某种形式的try / catch的情况下几乎无法使用。但是,再次:不要这样做。

答案 2 :(得分:0)

您可以返回自定义结果类:

public class Result
{
    public bool Okay { get; set; }
    public string Error { get; set; }
}

然后:

var result = AttemptSomething();

if (!result.Okay)
{
    Console.WriteLine(result.Error);
}

或者可以返回string

var error = AttemptSomething();

if (!String.IsNullOrEmpty(error))
{
    Console.WriteLine(error);
}

或者将错误视为out:

string error;
if (!AttemptSomething(out error))
{
    Console.WriteLine(error);
}

或者返回Exception扔。