Как узнать, что отложенная функция вызывается после успешного выполнения функции или из-за паники - PullRequest
1 голос
/ 11 июня 2019

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

package main

import "log"

func b() {
    panic("panicked in b")
}
func a() {

    b()
}
func main() {
    defer func() {
     // If panicked 
         log.Println("panicked")
         // if called after function successfully executed
         log.Println("Success")
         /* 
            How to understand if defer is triggered by panic or after function returned successfully.
         */
    }()
    a()
    log.Println("main code")
}

Ожидаемое: Defer должен знать, что он вызван паникой любым возможным способом

1 Ответ

3 голосов
/ 11 июня 2019

Вы можете использовать recover, чтобы уловить панику:

defer func() {
    if err := recover(); err != nil {
        fmt.Println("panic")
    } else {
        fmt.Println("successful")
    }
}()
...