英文:
Try exception alternative for protect not crash application
问题
我有一个用于抓取URL的Go应用程序。问题是它有时会崩溃并返回以下错误:
panic: runtime error: slice bounds out of range
goroutine 1 [running]:
main.dom6(0x187d4140, 0x8, 0x187d4179, 0x5, 0x187c0800, 0x6, 0x13, 0x83007cb)
/root/sswork.go:326 +0x6b
main.sub(0x187d4140, 0x8, 0x84464e0, 0x6, 0x6, 0x187d4140, 0x8, 0x187d4179, 0x5, 0x187c0800, ...)
/root/sswork.go:298 +0xb3
main.main()
/root/sswork.go:615 +0xccb
在第298行是这个函数:
294: // try our list of substitutions, if one works return it
295: func sub(str string, xs []subs, u string, p string, h string) string {
296: for _, x := range xs {
297: if strings.Contains(str, x.pattern) {
298: return strings.Replace(str, x.pattern, x.fn(u, p, h), 1)
299: }
300: }
301: return str
302:}
如何解决这个问题,使应用程序不再崩溃?
324: // the first 6 characters of the above
325: func dom6(u string, p string, d string) string {
326: return domfull(u, p, d)[0:6]
327: }
英文:
I have a Go application for scrape URLs. The problem is it sometimes crashes and returns this error:
panic: runtime error: slice bounds out of range
goroutine 1 [running]:
main.dom6(0x187d4140, 0x8, 0x187d4179, 0x5, 0x187c0800, 0x6, 0x13, 0x83007cb)
/root/sswork.go:326 +0x6b
main.sub(0x187d4140, 0x8, 0x84464e0, 0x6, 0x6, 0x187d4140, 0x8, 0x187d4179, 0x5, 0x187c0800, ...)
/root/sswork.go:298 +0xb3
main.main()
/root/sswork.go:615 +0xccb
on line 298 is this function :
294: // try our list of substitutions, if one works return it
295: func sub(str string, xs []subs, u string, p string, h string) string {
296: for _, x := range xs {
297: if strings.Contains(str, x.pattern) {
298: return strings.Replace(str, x.pattern, x.fn(u, p, h), 1)
299: }
300: }
301: return str
302:}
How can I solve my problem so it doesn't crash the application any more?
324: // the first 6 characters of the above
325: func dom6(u string, p string, d string) string {
326: return domfull(u, p, d)[0:6]
327: }
答案1
得分: 2
错误出现在第326行,而不是第298行。为了避免这样的恐慌,应在尝试对切片、数组或字符串进行索引或切片之前进行手动索引检查。
您指出第298行的代码如下:
// 上述代码的前6个字符
func dom6(u string, p string, d string) string {
return domfull(u, p, d)[0:6]
}
在尝试对其进行切片之前,请检查domfull()
返回的string
的长度,例如:
func dom6(u string, p string, d string) string {
df := domfull(u, p, d)
if len(df) < 6 {
return df
}
return df[:6]
}
英文:
The error is at line 326, not 298. And to avoid such panics, perform manual index check before attempting to index or slice a slice, array or string.
You indicated that the code at line 298 is:
// the first 6 characters of the above
func dom6(u string, p string, d string) string {
return domfull(u, p, d)[0:6]
}
Check the length of the string
returned by domfull()
before attempting to slice it, e.g.:
func dom6(u string, p string, d string) string {
df := domfull(u, p, d)
if len(df) < 6 {
return df
}
return df[:6]
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论