From 25eef75018e723fcab58e095623f8ce33fa2f66a Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Tue, 28 May 2019 12:30:32 +0200 Subject: [PATCH] error handling inside goroutines --- pkg/ecload/ecload.go | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/pkg/ecload/ecload.go b/pkg/ecload/ecload.go index 4f21a90..6903b6f 100644 --- a/pkg/ecload/ecload.go +++ b/pkg/ecload/ecload.go @@ -41,6 +41,10 @@ func DownloadBook(outDir string, size string, id string, logger Logger) error { semaphore := make(chan struct{}, MAX_DOWNLOADS) logger.Info.Println("downloading pages...") + + ec := make(chan error) + finished := make(chan bool, 1) + for index, pageUrl := range pageUrls { wg.Add(1) @@ -52,18 +56,31 @@ func DownloadBook(outDir string, size string, id string, logger Logger) error { <-semaphore }() - downloadUrl, err:= getSizeLink(pageUrl, size) + downloadUrl, err := getSizeLink(pageUrl, size) if err != nil { - //return err + ec <- err } filename := fmt.Sprintf("%06d.jpg", index) - downloadToFile(filename, dir, downloadUrl) - + err = downloadToFile(filename, dir, downloadUrl) + if err != nil { + ec <- err + } }(index, pageUrl) } - wg.Wait() + go func() { + wg.Wait() + close(finished) + }() + + select { + case <-finished: + case err := <-ec: + if err != nil { + return err + } + } err = os.MkdirAll(outDir, os.ModePerm) if err != nil { @@ -77,7 +94,7 @@ func DownloadBook(outDir string, size string, id string, logger Logger) error { } // Find the download link for a page of a specific size. -func getSizeLink(pageUrl string , size string) (string, error) { +func getSizeLink(pageUrl string, size string) (string, error) { doc, err := fetchDocument(pageUrl) if err != nil { return "", err