2017-09-08 3 views
-4

私はスクレイプURLのGoアプリケーションを持っています。問題は、それが時々あり、このエラーがクラッシュし、リターン:これ以上のアプリケーションをクラッシュしないようにアプリケーションをクラッシュさせないように保護する代替手段を試す

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:} 

がどのように私は私の問題を解決することができます:ライン298上の

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 

がこの機能ですか?

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: } 
+6

をエラーが行326であります298ではなく、このようなパニックを避けるために、スライスまたはアレイのインデックスまたはスライスを試みる前に、手動によるインデックスチェックを実行します。上記 FUNCのdom6の – icza

+0

//最初の6つの文字(U列、P列、D列)列{ \t戻りdomfull(U、P、D)[0:6] }変化関数dom6後 –

答えて

2

エラーがライン326、298ではないにあり、このようなパニックを避けるインデックスにしようとする前に、手動インデックスチェックを実行したり、スライス、配列や文字列をスライスします。

あなたがライン298でコードがあることが示された:

// the first 6 characters of the above 
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] 
} 
+0

、リターンこのエラー:./sswork.go:621:割り当てカウントの不一致:2 = 1 ./sswork.go:625:割り当て数の不一致:2 = 1 –

+0

@LucianBlaga Line 625はまったく別の場所ですが、そのことは分かりません。また、私は関数の本体を変更することを提案しましたが(署名ではありません)、あなたが言及したエラーの原因となることはありません。 – icza