Как я могу поймать исключение и продолжить, не выходя из программы - PullRequest
0 голосов
/ 16 апреля 2020

Я передаю список URL-адресов из текстового файла. Команда, как показано ниже

cat urls.txt | ./mygofile

, останавливается, если видит неправильный URL. Как я могу заставить его продолжаться, не выходя из программы? Я хочу показать простую ошибку и перейти к следующему URL без выхода

http://beap.adss.yahoo.com/
http://id.answers.yahoo.com/search
https://brokenurl
http://id.answers.yahoo.com/KnowledgeSearchService
http://id.answers.yahoo.com/question/nextQuestion
package main

import (
    "log"
    "bufio"
    "bytes"
    "fmt"
    "net/http"
    "os"
    "strings"
    "crypto/tls"
)

func main() {
    passedUrl := bufio.NewScanner(os.Stdin)
    var pUrl string
    for passedUrl.Scan() {
        fmt.Println(passedUrl.Text())
        if strings.Contains(passedUrl.Text(), "://"){
            pUrl = passedUrl.Text()
        } else {
            pUrl = "https://" + passedUrl.Text()
        }

        body := "<?xml version=\"1.0\"?>"
        customTransport := &(*http.DefaultTransport.(*http.Transport))
        customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
        client := &http.Client{Transport: customTransport}
        client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
            return http.ErrUseLastResponse
        }

        req, err := http.NewRequest("POST", pUrl, bytes.NewBuffer([]byte(body)))
        if err != nil {
            log.Println(err)
        }

        req.Header.Add("Content-Type", "application/xml; charset=utf-8")
        resp, err := client.Do(req)
        if err != nil {
            log.Println(err)
        }

        defer resp.Body.Close()
        var responseHeaders string
        for headerName, value := range resp.Header {
            responseHeaders += headerName + ": " + value[0] + "\n"
        }

        if strings.Contains(responseHeaders, "text/xml") {
            fmt.Printf("Match Head: ")
            fmt.Printf(pUrl)
            fmt.Println("")
        }
    }
}

Ниже приведено сообщение об ошибке

error

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Прямо сейчас ваш скрипт не прерывает l oop, все, что вам нужно, - остановите выполнение и перейдите к следующему pUrl. Примерно так должно работать:

req.Header.Add("Content-Type", "application/xml; charset=utf-8")
resp, err := client.Do(req)
if err != nil {
   log.Println(err)
   continue // stop here and process next item
}

Подробнее о for loops

1 голос
/ 16 апреля 2020

Вы печатаете ошибку, но игнорируете ее:

        resp, err := client.Do(req)
        if err != nil {
            log.Println(err)
        }

На данный момент, resp равно нулю, поскольку вызов не удался. Если есть ошибка, вам не следует продолжать обработку результата. Обработайте ошибку здесь в операторе if или верните ошибку вызывающей стороне, чтобы она могла обработать ее.

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