From 41afa60dce0cc651b8bba0b8085d471cb090693d Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Tue, 15 Jul 2014 14:35:19 +0700 Subject: [PATCH] Return errors instead of panicing --- loadavg.go | 15 ++++++++------- pid_stat.go | 15 ++++++++------- pid_statm.go | 15 ++++++++------- stat.go | 15 ++++++++------- uptime.go | 15 ++++++++------- 5 files changed, 40 insertions(+), 35 deletions(-) diff --git a/loadavg.go b/loadavg.go index 9f68caf..d9220e7 100644 --- a/loadavg.go +++ b/loadavg.go @@ -25,23 +25,24 @@ type ProcLoadavg struct { LastPid uint } -func NewProcLoadavg() ProcLoadavg { +func NewProcLoadavg() (ProcLoadavg, error) { + p := ProcLoadavg{} + b, err := ioutil.ReadFile("/proc/loadavg") if err != nil { - panic(err) + return p, err } - p := ProcLoadavg{} - parsed, err := fmt.Sscanf(string(b), "%f %f %f %d/%d %d", &p.Avg1Min, &p.Avg5Min, &p.Avg15Min, &p.RunnableEntities, &p.TotalEntities, &p.LastPid) if parsed < 6 { - fmt.Println("Managed to parse only", parsed, "fields out of 6") + err := fmt.Errorf("Managed to parse only %d fields out of 6", parsed) + return p, err } if err != nil { - panic(err) + return p, err } - return p + return p, nil } diff --git a/pid_stat.go b/pid_stat.go index d7cc3f0..8fcb288 100644 --- a/pid_stat.go +++ b/pid_stat.go @@ -210,15 +210,15 @@ type ProcPidStat struct { CguestTime int32 } -func NewProcPidStat(pid int) ProcPidStat { +func NewProcPidStat(pid int) (ProcPidStat, error) { + p := ProcPidStat{} + file := fmt.Sprintf("/proc/%d/stat", pid) b, err := ioutil.ReadFile(file) if err != nil { - panic(err) + return p, err } - p := ProcPidStat{} - parsed, err := fmt.Sscanf(string(b), "%d %s %s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "+ "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", @@ -231,11 +231,12 @@ func NewProcPidStat(pid int) ProcPidStat { &p.Nswap, &p.Cnswap, &p.ExitSignal, &p.Processor, &p.RtPriority, &p.Policy, &p.DelayacctBlkioTicks, &p.GuestTime, &p.CguestTime) if parsed < 44 { - fmt.Println("Managed to parse only", parsed, "fields out of 44") + err := fmt.Errorf("Managed to parse only %d fields out of 44", parsed) + return p, err } if err != nil { - panic(err) + return p, err } - return p + return p, nil } diff --git a/pid_statm.go b/pid_statm.go index 4701c93..9170a6e 100644 --- a/pid_statm.go +++ b/pid_statm.go @@ -17,24 +17,25 @@ type ProcPidStatm struct { Dt uint64 // Dirty pages (unused in Linux 2.6) } -func NewProcPidStatm(pid int) ProcPidStatm { +func NewProcPidStatm(pid int) (ProcPidStatm, error) { + p := ProcPidStatm{} + file := fmt.Sprintf("/proc/%d/statm", pid) b, err := ioutil.ReadFile(file) if err != nil { - panic(err) + return p, err } - p := ProcPidStatm{} - parsed, err := fmt.Sscanf(string(b), "%d %d %d %d %d %d %d", &p.Size, &p.Resident, &p.Share, &p.Text, &p.Lib, &p.Data, &p.Dt) if parsed < 7 { - fmt.Println("Managed to parse only", parsed, "fields out of 7") + err := fmt.Errorf("Managed to parse only %d fields out of 7", parsed) + return p, err } if err != nil { - panic(err) + return p, err } - return p + return p, nil } diff --git a/stat.go b/stat.go index fb06cb1..030de3f 100644 --- a/stat.go +++ b/stat.go @@ -29,24 +29,25 @@ type ProcStat struct { } } -func NewProcStat() ProcStat { +func NewProcStat() (ProcStat, error) { + p := ProcStat{} + b, err := ioutil.ReadFile("/proc/stat") if err != nil { - panic(err) + return p, err } - p := ProcStat{} - parsed, err := fmt.Sscanf(string(b), "cpu %d %d %d %d %d %d %d %d %d %d", &p.Cpu.User, &p.Cpu.Nice, &p.Cpu.System, &p.Cpu.Idle, &p.Cpu.Iowait, &p.Cpu.Irq, &p.Cpu.Softirq, &p.Cpu.Steal, &p.Cpu.Guest, &p.Cpu.GuestNice) if parsed < 10 { - fmt.Println("Managed to parse only", parsed, "fields out of 10") + err := fmt.Errorf("Managed to parse only %d fields out of 10", parsed) + return p, err } if err != nil { - panic(err) + return p, err } - return p + return p, nil } diff --git a/uptime.go b/uptime.go index b814c47..5df21eb 100644 --- a/uptime.go +++ b/uptime.go @@ -12,21 +12,22 @@ type ProcUptime struct { Idle float64 // Time spent in idle process in seconds } -func NewProcUptime() ProcUptime { +func NewProcUptime() (ProcUptime, error) { + p := ProcUptime{} + b, err := ioutil.ReadFile("/proc/uptime") if err != nil { - panic(err) + return p, err } - p := ProcUptime{} - parsed, err := fmt.Sscanf(string(b), "%f %f", &p.Uptime, &p.Idle) if parsed < 2 { - fmt.Println("Managed to parse only", parsed, "fields out of 2") + err := fmt.Errorf("Managed to parse only %d fields out of 2", parsed) + return p, err } if err != nil { - panic(err) + return p, err } - return p + return p, nil }