我知道这是糟糕的编程习惯和冗余编码,但我很好奇。
我只是在一个while循环中计算一个高达9999999的数字。 Add()
函数只会增加该数字并将其打印出来。
在Add()
函数内部,我调用Add()
函数。
我的程序在获得StackOverflow异常之前成功打印出12000个数字。
所以我的问题=有没有办法忽略这个错误并继续计数?
我尝试了On Error Resume
,Try/Catch
和throw
我的代码如下。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
While number1 < 9999999
Try
add()
Catch ex As StackOverflowException
''Do Stuff here
End Try
End While
End Sub
Function add()
number1 = number1 + 1
Trace.WriteLine(number1) ''Error is throw here
add()
Return number1
End Function
答案 0 :(得分:4)
有没有办法忽略这个错误
没有。你唯一能做的就是避免首先造成它。大多数情况下,StackOverflowExceptions无法捕获。来自MDSN:
从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程。
答案 1 :(得分:3)
由于VB.NET不支持tail recursion,因此无法在不最终溢出堆栈的情况下进行无限递归。
答案 2 :(得分:1)
你永远不会从函数返回:
Function add()
number1 = number1 + 1
Trace.WriteLine(number1)
add()
Return number1
End Function
因此,add
调用add
调用add
- 在某些时候你正在吹嘘堆栈。你需要某种退出条件来测试。
例如:
Function add()
number1 = number1 + 1
Trace.WriteLine(number1)
If number1 < 99999999 Then
add()
Else
Return number1
End If
End Function
答案 3 :(得分:0)
从此处更改您的方法:
Function add()
number1 = number1 + 1
Trace.WriteLine(number1) ''Error is throw here
add()
Return number1
End Function
对此:
Function add()
number1 = number1 + 1
Trace.WriteLine(number1) ''Error is throw here
Return number1
End Function
保持其余代码相同,不会发生堆栈溢出。