Предотвратить панику во время выполнения в bson.ObjectIdHex - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь преобразовать строку objectid в формат bson ObjectId с помощью mgo,

errCheck := d.C("col").FindId(bson.ObjectIdHex(obid[0])).One(&Result)

, почему, но если я введу неверную / неверную строку ввода, мое приложениеесть паника во время выполнения

как я могу предотвратить это?спасибо

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Как сказал @icza в последнем ответе.Вы должны проверить правильность, если ObjectId.И вы можете использовать отсрочка панического восстановления для обработки любых ошибок в будущем

package main

import (
    "fmt"
    "gopkg.in/mgo.v2/bson"
    "path/filepath"
    "runtime"
    "strings"
)

func main() {
    r := Result{}
    getData(&r)
}

func IdentifyPanic() string {
    var name, file string
    var line int
    var pc [16]uintptr

    n := runtime.Callers(3, pc[:])
    for _, pc := range pc[:n] {
        fn := runtime.FuncForPC(pc)
        if fn == nil {
            continue
        }
        file, line = fn.FileLine(pc)
        name = fn.Name()

        if !strings.HasPrefix(name, "runtime.") {
            break
        }
    }
    file = filepath.Base(file)

    switch {
    case name != "":
        return fmt.Sprintf("%v:%v", file, line)
    case file != "":
        return fmt.Sprintf("%v:%v", file, line)
    }

    return fmt.Sprintf("pc:%x", pc)
}

type Result struct {
    success int
    data string
}
func getData(result *Result){
    defer func() {
        if err := recover(); err != nil {
            ip := IdentifyPanic()
            errorMessage := fmt.Sprintf("%s Error: %s", ip, err)
            fmt.Println(errorMessage)
            result.success = 0
        }
    }()
    if bson.IsObjectIdHex(obid[0]) {                                 // this line copied from @icza answer
        // It's valid, calling bson.ObjectIdHex() will not panic...  // this line copied from @icza answer
        errCheck := d.C("col").FindId(bson.ObjectIdHex(obid[0])).One(&res)
        result.success = 1
        result.data = "your result (res). this is just the exam"
    }else{
        result.success = 0  
    }
}
0 голосов
/ 10 декабря 2018

bson.ObjectIdHex() документирует, что он будет паниковать, если вы передадите неверный идентификатор объекта:

ObjectIdHex возвращает ObjectId из предоставленного шестнадцатеричного представления. Вызов этой функции с недопустимым шестнадцатеричным представлением вызовет панику во время выполнения. См. Функцию IsObjectIdHex.

Если вы хотите избежать этого, сначала проверьте входную строку, используя bson.IsObjectIdHex(), и приступайте к вызову bson.ObjectIdHex() только в том случае, если ваш ввод действителен:

if bson.IsObjectIdHex(obid[0]) {
    // It's valid, calling bson.ObjectIdHex() will not panic...
}
...