我正在创建一个“Common”库,供其他团队成员在各种解决方案项目中使用。这些方法通常是void
函数,没有实际的返回数据。
我正在寻找一个为什么强迫其他人在Try...Catch
块内使用这些方法。我需要确保错误得到妥善处理。我虽然依赖布尔返回类型,但也不允许我返回错误消息,所以我唯一的选择是抛出Exception
。
如果无法进行适当的强制,如何在编译时弹出一个属性以警告开发人员有关Try / Catch的要求? (Obsolete
属性的排序。)
还有其他更好的方法吗?
修改
以下是我的完整情景:
我有一个调用Web服务的代码方法来远程更新值。更新非常重要。它自己运行的方法很好,但如果无法访问Web服务怎么办?该调用不会返回任何值。
答案 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
但不扔。