English 中文(简体)
A. 戈兰的混杂石
原标题:Catching panics in Golang

如无档案论证,则按第9条线(<代码>panic:操作时间错误:按预期,从中排出。

我怎么能够赶上这一恐慌,并在直接通过时处理。 引起恐慌的Args? 很多东西如PHP的尝试/捕获物,或试图/例外。

I ve had a search here on StackOverflow but I ve not found anything that answers this as such.

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open(os.Args[1])
    if err != nil {
        fmt.Println("Could not open file")
    }
    fmt.Printf("%s", file)
}
最佳回答

Go is not python, 你在使用前应适当检查增益:

func main() {
    if len(os.Args) != 2 {
         fmt.Printf("usage: %s [filename]
", os.Args[0])
         os.Exit(1)
    }
    file, err := os.Open(os.Args[1])
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", file)
}
问题回答

pan方案可recover,内附在recover(>上:

《<条码>覆盖功能》允许实施一个方案,以管理条形形色色体的行为。 维护职能<代码>G G正在执行。 递延职能的运行达到<代码>D时,<代码>Ds 至recover<>/code>的返回价值将转至<代码>panic。 如果<代码>D回归,通常不启动新的<代码>panic,则计算顺序停止。 在这种情况下,取消在<代码>G和<代码>panic之间要求的职能状态,恢复正常执行。 由<代码>G在/code>之前推迟执行的任何职能,均在<代码>后开始行使,并<代码>。 G通过返回其打电话者终止执行。

<代码>recover的回报值:nil 如果 go形不是pan或recover<>/code>不是由递延职能直接指定。 反之,如果 go星和recover<>/code>由递延职能直接指定,则保证不将<代码>recover的返还价值改为nil。 为了确保这一点,请在<代码>panic 上加上一个nil接口值(或一个未打字的<代码>nil)产生一个

这方面的一个例子是:

// access buf[i] and return an error if that fails.
func PanicExample(buf []int, i int) (x int, err error) {
    defer func() {
        // recover from panic if one occurred. Set err to nil otherwise.
        if recover() != nil {
            err = errors.New("array index out of bounds")
        }
    }()

    x = buf[i]
}

发觉往往不是,ick就不是正确的解决办法。 戈马模式是明确检查错误。 只有在普通方案执行期间不发生恐慌的情况下,一项方案才应当宽松。 例如,不能开立档案是可能发生的事情,不应造成恐慌,而忽略不计。 然而,这一机制甚至能够赶上这些案件,或许可以轻松地关闭。

Some Golang official packages use panic/defer+recover as throw/catch, but only when they need to unwind a large call stack. In Golang s json package using panic/defer+recover as throw/catch is the most elegant solution.

from http://blog.golang.org/defer-panic-and-recover

For a real-world example of panic andrecovery, see the json Pack from the Go standard Library. 它将JSON-encoded数据与一套复读功能分开。 当碰到恶名JSON时,<>>> 寄生虫 calls,以冲破顶级功能电话,从Ppanic中回收,并退回适当的错误值(见密码上国语的错误和无色方法)。

Search for d.error( at http://golang.org/src/encoding/json/decode.go

例如,正如其他解决办法所指出的,“属地”解决办法是在使用参数之前检查参数。

But, if you want/need to catch anything you can do:

package main

import (
    "fmt"
    "os"
)

func main() {

    defer func() { //catch or finally
        if err := recover(); err != nil { //catch
            fmt.Fprintf(os.Stderr, "Exception: %v
", err)
            os.Exit(1)
        }
    }()

    file, err := os.Open(os.Args[1])
    if err != nil {
        fmt.Println("Could not open file")
    }

    fmt.Printf("%s", file)
}

首先:你不想这样做。 处理副渔获物类错误没有错误。 在戈里,你将首先检查<代码>len(os.Args),只有在有出入要素1的情况下才能检查。

对于少有的情况,你需要收集潘基文(你的情况是<>>而不是 其中一例!)与<代码>recover合并使用。 见http://golang.org/doc/eff_go.html#recover>http://golang.org/doc/eff_go.html#recover

We can manage panic without halting process using recover. By calling recover in any function using defer it will return the execution to calling function. Recover returns two values one is boolean and other one is interface to recover. Using type assertion we can get underlying error value You can also print underlying error using recover.

defer func() {
    if r := recover(); r != nil {
        var ok bool
        err, ok = r.(error)
        if !ok {
            err = fmt.Errorf("pkg: %v", r)
        }
    }
}()

虽然在Go isn t idiomatic and shouldn t中,panic 将用作其他方案拟订语文的例外情况,但有时需要fish

在这些情况下,我发现界定“<代码”是有益的。 CatchPanic util thattranspanic into aeckable err<>/code> to minimum differences from . Go s idioms。

例如:

func CatchPanic[T interface{}](f func() T) (ret T. err error) {
    defer func() {
        rec = recover()
        if rec != nil {
            err = errors.New(fmt.Sprint(rec))
        }
    }()
    return f(), nil
}

使用实例(过于简单化):

func main() {
    arr := []int{0, 1, 2, 3, 4}
    val, err := CatchPanic(func() int {
        return arr[5] // Will panic
    })
    if err != nil {
        // Handle error
    }
}

lam贝达参数的回报价值可与其他使用案例加以调整。

请注意,在可能时,它建议不要重复在戈马的恐慌渔获量,在进入之前检查。





相关问题
handling exceptions IN Action Filters

Is there a better way to handle exceptions that occur inside an Action Filter itself in ASP .NET MVC? There re 2 ways I can think of at the moment. Using a try catch and setting the HTTP Status ...

既可捕获,又可举出例外。

我有一种办法,可以进入亚洲开发银行,因此,我国的亚行在多瑙河航道中的所有 st子都位于一个试捕区。 它正在追捕Kexception

Cross compiler exception handling - Can it be done safely?

I am doing some maintenance on a C++ windows dll library that is required to work with different VC++ compilers (as I don’t want to address different mangling schemes). I have already eliminated any ...

File Handling Issue

I am developing a tool in c#, at one instance I start writing into a xml file continuously using my tool,when i suddenly restart my machine the particular xml file gets corrupted, what is the reason ...

Watch a memory location/install data breakpoint from code?

We have a memory overwrite problem. At some point, during the course of our program, a memory location is being overwritten and causing our program to crash. the problem happens only in release mode. ...

Unit Test for Exceptions Message

Is there a simple (Attribute-driven) way to have the following test fail on the message of the exception. [TestMethod()] [ExpectedException(typeof(ArgumentException))] public void ExceptionTestTest() ...