add: error handling

This commit is contained in:
Inanc Gumus
2019-05-16 23:21:20 +03:00
parent 6afca55dfe
commit 15216f55f0
30 changed files with 374 additions and 24 deletions

View File

@ -14,25 +14,6 @@ import (
"os"
)
/*
// Most other languages do this:
try {
// open a file
// throws an exception
} catch (ExceptionType name) {
// handle the error
} finally {
// close the file
}
// Go way:
file, err := // open the file
if err != nil {
// handle the error
}
// close the file
*/
func main() {
files := []string{
"pngs/cups-jpg.png",
@ -43,11 +24,11 @@ func main() {
"pngs/empty.png",
}
pngs := detect(files)
valids := detect(files)
fmt.Printf("Correct Files:\n")
for _, png := range pngs {
fmt.Printf(" + %s\n", png)
for _, valid := range valids {
fmt.Printf(" + %s\n", valid)
}
}
@ -89,7 +70,7 @@ func read(filename string, buf []byte) error {
return err
}
func detectPNGUnsafeAndVerbose(filenames []string) (pngs []string) {
func detectPNGUnsafeAndVerbose(filenames []string) (valids []string) {
const pngHeader = "\x89PNG\r\n\x1a\n"
buf := make([]byte, len(pngHeader))
@ -118,7 +99,7 @@ func detectPNGUnsafeAndVerbose(filenames []string) (pngs []string) {
}
if bytes.Equal([]byte(pngHeader), buf) {
pngs = append(pngs, filename)
valids = append(valids, filename)
}
}
return

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,111 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import (
"bytes"
"fmt"
"io"
"os"
)
/*
// ~~~ THE CLASSIC WAY ~~~
try {
// open a file
// throws an exception
} catch (ExceptionType name) {
// handle the error
} finally {
// close the file
}
// ~~~ GO WAY ~~~
file, err := // open the file
if err != nil {
// handle the error
}
// close the file
// really really exceptional problem occurs
// mostly due to a programmer
// panic("PANIC PANIC")
*/
func main() {
files := []string{
"pngs/cups-jpg.png",
"pngs/forest-jpg.png",
"pngs/golden.png",
"pngs/work.png",
"pngs/shakespeare-text.png",
"pngs/empty.png",
}
list("png", files)
// fmt.Println("catch me if you can!")
}
func list(format string, files []string) {
valids := detect(format, files)
fmt.Printf("Correct Files:\n")
for _, valid := range valids {
fmt.Printf(" + %s\n", valid)
}
}
func detect(format string, filenames []string) (valids []string) {
header := headerOf(format)
buf := make([]byte, len(header))
for _, filename := range filenames {
if read(filename, buf) != nil {
continue
}
if bytes.Equal([]byte(header), buf) {
valids = append(valids, filename)
}
}
return
}
func headerOf(format string) string {
switch format {
case "png":
return "\x89PNG\r\n\x1a\n"
case "jpg":
return "\xff\xd8\xff"
}
panic("unknown format: " + format)
}
// read reads len(buf) bytes to buf from a file
func read(filename string, buf []byte) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
fi, err := file.Stat()
if err != nil {
return err
}
if fi.Size() <= int64(len(buf)) {
return fmt.Errorf("file size < len(buf)")
}
_, err = io.ReadFull(file, buf)
return err
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,12 @@
come night come romeo come thou day in night
for thou wilt lie upon the wings of night
whiter than new snow on a raven's back
come gentle night come loving black-browed night
give me my romeo and when he shall die
take him and cut him out in little stars
and he will make the face of heaven so fine
that all the world will be in love with night
and pay no worship to the garish sun
oh i have bought the mansion of love
but not possessed it and though i am sold
not yet enjoyed

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,99 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import (
"bytes"
"fmt"
"io"
"os"
)
func main() {
defer func() {
if rerr := recover(); rerr != nil {
fmt.Println("panicked:", rerr)
}
}()
files := []string{
"pngs/cups-jpg.png",
"pngs/forest-jpg.png",
"pngs/golden.png",
"pngs/work.png",
"pngs/shakespeare-text.png",
"pngs/empty.png",
}
args := os.Args[1:]
if len(args) != 1 {
fmt.Println("png or jpg?")
return
}
list(args[0], files)
// fmt.Println("catch me if you can!")
}
func list(format string, files []string) {
valids := detect(format, files)
fmt.Printf("Correct Files:\n")
for _, valid := range valids {
fmt.Printf(" + %s\n", valid)
}
}
func detect(format string, filenames []string) (pngs []string) {
header := headerOf(format)
buf := make([]byte, len(header))
for _, filename := range filenames {
if read(filename, buf) != nil {
continue
}
if bytes.Equal([]byte(header), buf) {
pngs = append(pngs, filename)
}
}
return
}
func headerOf(format string) string {
switch format {
case "png":
return "\x89PNG\r\n\x1a\n"
case "jpg":
return "\xff\xd8\xff"
}
// this should never occur
panic("unknown format: " + format)
}
// read reads len(buf) bytes to buf from a file
func read(filename string, buf []byte) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
fi, err := file.Stat()
if err != nil {
return err
}
if fi.Size() <= int64(len(buf)) {
return fmt.Errorf("file size < len(buf)")
}
_, err = io.ReadFull(file, buf)
return err
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,12 @@
come night come romeo come thou day in night
for thou wilt lie upon the wings of night
whiter than new snow on a raven's back
come gentle night come loving black-browed night
give me my romeo and when he shall die
take him and cut him out in little stars
and he will make the face of heaven so fine
that all the world will be in love with night
and pay no worship to the garish sun
oh i have bought the mansion of love
but not possessed it and though i am sold
not yet enjoyed

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,49 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import (
"fmt"
"os"
"github.com/inancgumus/learngo/internal/magic"
)
func main() {
files := []string{
"pngs/cups-jpg.png",
"pngs/forest-jpg.png",
"pngs/golden.png",
"pngs/work.png",
"pngs/shakespeare-text.png",
"pngs/empty.png",
}
args := os.Args[1:]
if len(args) != 1 {
fmt.Println("png or jpg?")
return
}
list(args[0], files)
// fmt.Println("catch me if you can!")
}
func list(format string, files []string) {
valids, err := magic.Detect(format, files)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Correct Files:\n")
for _, valid := range valids {
fmt.Printf(" + %s\n", valid)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,12 @@
come night come romeo come thou day in night
for thou wilt lie upon the wings of night
whiter than new snow on a raven's back
come gentle night come loving black-browed night
give me my romeo and when he shall die
take him and cut him out in little stars
and he will make the face of heaven so fine
that all the world will be in love with night
and pay no worship to the garish sun
oh i have bought the mansion of love
but not possessed it and though i am sold
not yet enjoyed

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

74
internal/magic/detect.go Normal file
View File

@ -0,0 +1,74 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package magic
import (
"bytes"
"fmt"
"io"
"os"
)
// Detect returns only the valid filenames that match to a header of the given format.
func Detect(format string, filenames []string) (valids []string, err error) {
defer func() {
if rerr := recover(); rerr != nil {
err = fmt.Errorf("cannot detect: %v", rerr)
}
}()
return detect(format, filenames), nil
}
func detect(format string, filenames []string) (valids []string) {
header := headerOf(format)
buf := make([]byte, len(header))
for _, filename := range filenames {
if read(filename, buf) != nil {
continue
}
if bytes.Equal([]byte(header), buf) {
valids = append(valids, filename)
}
}
return
}
func headerOf(format string) string {
switch format {
case "png":
return "\x89PNG\r\n\x1a\n"
case "jpg":
return "\xff\xd8\xff"
}
// this should never occur
panic("unknown format: " + format)
}
// read reads len(buf) bytes to buf from a file
func read(filename string, buf []byte) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
fi, err := file.Stat()
if err != nil {
return err
}
if fi.Size() <= int64(len(buf)) {
return fmt.Errorf("file size < len(buf)")
}
_, err = io.ReadFull(file, buf)
return err
}