2016-08-05 2 views
1

Есть ли способ поймать ошибку переполнения стека в golang? В настоящее время я использую go recover() выполнить эту работу (ниже фрагмента кода), похоже, что ошибка переполнения стека не может быть обнаружена.Как поймать ошибку переполнения стека в golang

defer func() { 
      if x := recover(); x != nil { 
       log.Error("In recover, cought error====================", x) 
      } 
     }() 

fn(xxx) 

ответ

3

То, что вы видите на выходе, является «фатальной ошибкой», а не паникой.

fatal error: stack overflow 

Вы можете использовать только recover() для восстановления после паники. Переполнение стека является фатальной ошибкой, вызванной средой выполнения, которая заставляет процесс печатать трассировку стека и завершать работу.

+0

Тогда как можно справиться с этой фатальной ошибкой? Это приведет к сбою программы. – zgcharley

+0

Вы не можете справиться с этим, это должно разрушить вашу программу. Если вы используете эту ошибку, проблема с вашей программой. – JimB

+2

К сожалению, это в библиотеке, которую я использую, я хочу обрабатывать ее на своем уровне. Похоже, нет способа сделать это ... – zgcharley

1

В Голанге существует два способа распространения ошибок, чтобы вернуть ошибку, которая в основном зависит от функции, а не фатальные ошибки. Другие один является паникой, распространяющаяся через функцию стеку вызовов до окончания процесса или пока он не достиг восстановление

Panic является встроенной функцией, которая останавливает обычный поток управления и начинает паниковать. Когда функция F вызывает панику, выполнение F останавливается, любые отложенные функции в F выполняются нормально, а затем F возвращается к вызывающему. Для вызывающего абонента F затем ведет себя как призыв к панике. Процесс продолжается до стека до тех пор, пока все функции в текущем goroutine не вернутся, и в этот момент программа выйдет из строя. Паники могут быть инициированы путем прямого вызова паники. Они также могут быть вызваны ошибками времени выполнения, такими как доступ к массивам вне границ.

Восстановление - это встроенная функция, которая восстанавливает контроль над паникой goroutine. Восстановление полезно только в отложенных функциях. Во время нормального выполнения вызов для восстановления возвращает нуль и не имеет другого эффекта. Если текущий goroutine впадает в панику, вызов для восстановления захватит значение, данное панике, и возобновит нормальное выполнение.

Если вы хотите игнорировать панику вы можете позвонить восстановить и инспектировать сообщение паники, чтобы увидеть, если сообщение паники ожидаемого типа, который нормально игнорировать

Вот как вы можете сделать это

//RecoverPanic recovers from panic given the message String 
//if no message string is given it recovers from all panics 
//Example: 
// defer RecoverPanic("stack overflow") 
//The above satatement recovers any function from panic that happen 
//due to stackoverflow 
func RecoverPanic(msg string) { 
     if r := recover(); r != nil { 
       if msg != "" { 
         if r != msg { 
           panic(r) 
         } 
       } 
     } 
} 

После этого вы можете позвонить, в начале вызова функции

funtion foo(){ 
    defer RecoverPanic("stack overflow") 
    ...... 
} 

Есть иногда Паника не может быть охарактеризована, например, паника при попытке выделить память из-за недостаточной памяти, которую нельзя пытаться обрабатывать, поскольку функция для обработки сама по себе может паниковать, поскольку нет памяти для хранения ее данных.

+0

спасибо за подробное объяснение, полезно понять, как обрабатывать ошибки в go. Но конкретный вопрос, я должен выбрать ответ JimB как разрешение. – zgcharley

+0

@zgcharley Вы можете использовать функцию, определенную выше как RecoverPanic, и использовать, как упоминалось, как общее решение для нее. Функция указывает игнорировать панику, что паника имеет определенный тип, который в вашем случае может быть «переполнением стека», –

 Смежные вопросы

  • Нет связанных вопросов^_^