c# return that also returns the calling function - similar to PHP's die() early out
注意:这是一个从PHP角度来看的问题。也许这不是正确的方法,但我正努力做到这一点。
假设您定义了:
1 2 3 4
| void Die(string error){
print(error);
return;
} |
从另一个方法调用它:
1 2 3 4 5 6
| void CallingFunction(){
if(SomethingDoesNotCheckOut())
Die("bla");
// do stuff
} |
是否可以让die()在调用它的"parent"方法中提前触发?
一个例子:
1 2 3 4 5 6
| void CallingFunction(){
if(index>arrayLength)
Die("that's too big!");
// do stuff
} |
似乎Try-Catch对于这个来说是多余的,但是我更希望能够调用一个函数来停止当前的"parent"函数。也许我想得太像php的死神了
- 你说早出晚归是什么意思?
- 例外情况下,try和catch是处理c中错误的最佳方法。返回值更为C样式。
- 看看你的标题和代码,我想当一切正常的时候你只需要一个其他的块。
- @如果有条件提前退房,史蒂夫提前退房指提前退房。
- 即使有异常,也不能强制方法提前返回。方法总是可以在try/catch中包装对方法的调用。但是,通过合作,您可以使用异常来"展开"堆栈,并返回到堆栈中较高的调用方。有关详细信息,请参见标记的重复项。在您的场景中,Die()可以抛出异常,只要CallingFunction()没有捕获它,控件将返回到调用堆栈中的下一个catch块。
- 添加了一个示例…简单检查索引是否在数组长度范围内似乎很简单…似乎尝试/捕获是过度杀伤力?
- 为什么不只是if (condition) { Die("message"); return; }?
- 如果(somethingbad)死亡("原因");返回;其他做事情
- 为什么"尝试/捕获"是"过度杀戮"?你认为这种情况会发生吗?当然,您不应该在程序中对正常的流控制使用异常处理,所以如果您打算将超出范围的值设置为合法状态,您将需要一种不同的机制。但你的问题并不能解释你是如何进入那种状态的,你为什么要那样处理它,你已经尝试了什么,为什么这对你不起作用。
- @史蒂夫看起来不够优雅
- @通常情况下,如果我是一个永远不会发生的操作员,但是我正在尝试打开一些代码的源代码…所以未知的回购用户可能会让类似的小情况发生
- 我该怎么说?情人眼里出西施
- 所以,这本身不是一个复制品…更新了这个问题,以反映为什么这对于来自PHP的人来说是一个合理的问题,即使答案只是使用异常。
- 如果"未知用户"因为不理解控制流而编写错误代码,那么这就是他们的问题。除例外情况外,C中没有等同于"die"的内容。但是,对于正常的控制流,应该使用return。您的示例是方法的一个简单的guard子句,它要么是足够严重的异常,要么是不严重的简单返回。简单地说,不要创造一个"死亡"的方法,你应该是好的。如果您需要记录故障,那么将该方法改为日志记录方法,任何人都不应该认为它会在过程中"强制提前返回"。
- @INA不使用异常来简单地驱动代码流。
- "未知的repo用户可能会让类似的小情况发生"——然后您将处理参数验证,并且一个异常是适当的。
- 简单地说,让我来扩展一下,不要试图用C语言重新实现PHP习惯用法。php和c有很多不同的处理方法,任何从php到c的程序员都应该学习c,并把聪明的东西带来,但是他们不应该强迫任何一种语言和另一种语言一样,试图这样做只会失败。
- 别担心优雅。开发人员需要担心的两个主要问题是:1)性能。2)最小资源使用(内存)。
- @巴赫罗姆,我认为C是一种管理语言,所以你不能很好地控制记忆?
- 请不要使用这个评论线程来了解php和c之间的每一个区别,或者提出其他主题,关注手头的问题以及是否需要打开其他问题,否则我们现在就可以关闭这个评论线程,因为它不适合线程对话。
- @我尊重你的智慧。我同意php不应该应用于c,但对于php中的某个人来说,这是一个有效的"学习问题",可以在c上提问。我仍在努力理解为什么人们会投反对票。
- 我认为这里的主要问题是你没有问"我有这个PHP代码,我怎么用C语言做类似的事情",而是"我有这个PHP代码,现在我把它重写成C语言,如何让它表现得像PHP"。但我没有投反对票,所以这只是个猜测。
- debug.assert实际上是我要找的
通常为此目的使用异常。只需抛出一个Exception:
1 2 3 4
| void Die (string error ){
print (error );
throw new Exception (error );
} |
您可以通过在更高级别上实现一个try ... catch来随时处理它。
1 2 3 4 5 6 7 8
| try
{
// Something that can call Die.
}
catch (Exception ex)
{
// Something threw an exception. Now handle it.
} |
不,不要不抛出异常。记住,在许多情况下,调用方法将是非空的——在这种情况下,您希望它返回什么值?
老实说,您所描述的用例听起来确实更适合处理异常情况。这就是C惯用的错误处理机制。
如果要收集错误而不使用异常,则必须显式返回。