问题不在于如何漂亮地编程以使这个问题不会出现,而是关于一个漂亮的包装器try-catch。
try
{
}
catch
{
// здесь ничего нет
}
- 这是一件好事,但它占用了大量空间,我希望它可以放在一个块中,但执行相同的功能
我正在制作一段代码,它是一个安全网,根本不值得太多关注(现在我只关注未来,因为我已经不止一次地考虑过这个问题,好吧,放松一下)。优雅地重构是不值得的。你需要简单快速地说出来try,但我希望它看起来很漂亮。如果某些东西在那里不起作用,那没关系,但我也希望它不要在重要的地方出现异常,所以问题是关于try-catch.
有一个选项可以创建一个方法:
private void Try(Action codeBlock)
{
try
{
codeBlock?.Invoke();
}
catch
{
}
}
那么呼叫将在一行中,但此选项不是 100%,例如:
这似乎不是一个美丽的挑战
Try( ()=>DoWork() );,我想要更简单的东西,没有花里胡哨您可以将方法调用直接传递到参数
Try(MethodCall)中,它看起来已经更好了,但是在我的特殊情况下,我将不得不将这个安全网和次要的方法分成许多部分,例如,如果情况是这样的:private static void EnsureSomethingWhichFailsAnyway(Someting input) { try { foreach (var x in input.GetAllX()) { DoSmallThing(x); try { x.SetPropertyValue = PossibleValues.BigValue; } catch { } } } catch { } try { foreach (var y in input.GetllY()) { try { y.Validate(StaticVars.A, StaticVars.B, StaticVars.C); } catch { } } } catch { } }也就是说,如果你把这样的方法分解成子方法来调用类型,
Try(MethodCall)那么游戏就得不偿失了。有可能以某种方式放入
using吗?- 也许没有理想的解决方案,那么只是听到建设性的想法很有趣。
谢谢!
我想到了一个可以让你适应一个街区的想法。
你可以像这样使用它:
这是原始实现:
AutoTryAction例子:
相反,我建议将 try-catch 结合在一起,因为 我认为构建一个用于捕获错误的框架是一项代价高昂的操作。你可以用一个循环来做到这一点。让你有10个案例。相反,我
try{}catch{}将不得不写case x:; break;我害怕获得可疑的收益。除非...自动代码编辑器不会把它变成 5 行。封面好像很小。我认为如果没有例外,它将提高性能......但只是轻微的。更紧凑的版本
据我了解,这并没有任何意义。
using (var x=new Try(MethodCall))- 这将被扭曲。不管是什么变态……理论上,有可能发现错误的立场……但实际上,它不太可能奏效。选项2。基于选项1,并且知道代码行号,您可以萨满。但同样,“有条件地”。如果我们假设每一行都执行一次,那么我们可以这样做:
出现异常时会发生循环,无论是否有异常都会跳过 if 中传入的方法。刀具可以通过字典制作(它会更“聪明”)。但是代码应该假设分解成步骤,就像前面的情况一样,但是步骤可以更“自由”地安排。步骤之间不应有间隙。对 trysafe 的调用必须始终出现在程序的不同行中。kkey 参数也可以根据情况缩短并移至全局范围。
PS 静默异常使用起来很危险,因为最终很难找到错误。
您可以尝试功能方法:
例子:
关于它的来源:C# Fundamentals 的类别理论
视频:uDev Tech Meetup #10:函数式 C#