Сам вызов функции, не может избежать ошибки StackOverflow - PullRequest
2 голосов
/ 07 октября 2011

Я понимаю, что это плохая практика программирования и избыточное кодирование, но я любопытен.

Я просто считаю число до 9999999 в цикле while.Функция Add() просто увеличивает это число и печатает его.

Внутри функции Add() Я вызываю функцию Add().

Моя программа успешно распечатывает 12000-ых чисел, прежде чем я получу исключение StackOverflow.

Итак, мой вопрос =Есть ли способ игнорировать эту ошибку и продолжать считать?

Я пробовал 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

Ответы [ 4 ]

4 голосов
/ 07 октября 2011

Есть ли способ игнорировать эту ошибку

Нет.Единственное, что вы можете сделать, это не вызвать его в первую очередь.Большую часть времени, StackOverflowExceptions исключаются.Начиная с MDSN :

Начиная с .NET Framework версии 2.0, объект StackOverflowException не может быть перехвачен блоком try-catch, и соответствующий процесс завершается по умолчанию.

3 голосов
/ 07 октября 2011

Поскольку VB.NET не поддерживает хвостовую рекурсию , вы не сможете создать бесконечную рекурсию, не переполнив в итоге стек.

1 голос
/ 07 октября 2011

Вы никогда не возвращаетесь из функции:

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
0 голосов
/ 07 октября 2011

Измените свой метод следующим образом:

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 

Оставьте остальной код таким же, и переполнение стека не произойдет.

...