मैं एक साधारण कंसोल शतरंज गेम लिखकर हास्केल सीखने की कोशिश कर रहा हूं। यह एक शतरंज बोर्ड प्रदर्शित करता है और SAN notation में मानक इनपुट से चाल प्राप्त करता है। यहाँ मैं अब तक क्या कर लिया है:हास्केल में रनटाइम त्रुटियों को कैसे संभालें?
import System.IO
import Chess
import Chess.FEN
main = do
putStrLn "Welcome to Console Chess!"
putStrLn $ show defaultBoard
gameLoop defaultBoard
gameLoop board = do
putStr "Your move: "
hFlush stdout
move <- getLine
let newBoard = moveSAN move board
case newBoard of
Left _ -> do
putStrLn "Invalid move, try again..."
gameLoop board
Right b -> do
putStrLn $ show b
gameLoop b
समस्या यह है कि moveSAN
कार्य करने के लिए कॉल कभी कभी कार्यक्रम दुर्घटनाओं, खेल में किए गए सभी प्रगति को खोने है। उदाहरण के लिए, पर Enter दबा "आपका कदम:" शीघ्र निर्माण करता है:
Your move:
cchess: Prelude.head: empty list
अन्यथा, एक दो अंकों की संख्या में प्रवेश का उत्पादन:
Your move: 11
cchess: Error in array index
दो अवधियों में प्रवेश कर देता है:
Your move: ..
cchess: Char.digitToInt: not a digit '.'
मैं इन त्रुटियों को पकड़ना चाहता हूं और उपयोगकर्ता को सूचित करना चाहता हूं कि उनके द्वारा दर्ज किए गए कदम मान्य SAN नोटेशन में नहीं हैं। मैं उसे कैसे कर सकता हूँ?
आपका कोड सही है। यह आपके द्वारा उपयोग की जा रही chesshs लाइब्रेरी में एक बग है। खराब इनपुट पर इसे 'बाएं नोपर्स' वापस करना चाहिए, लेकिन इसके बजाय यह 'हेड' और 'digitToInt' जैसे आंशिक कार्यों के उपयोग के कारण दुर्घटनाग्रस्त हो जाता है :( –
मैं सहमत हूं, समाधान कुल कार्य है, जो केवल स्वयं को बना सकता है कार्यों को पूरा करने के लिए आपको कैच स्टेटमेंट में लाइब्रेरी कॉल को लपेटने की आवश्यकता होगी ... –
"आपको कैच स्टेटमेंट में लाइब्रेरी कॉल को लपेटने की आवश्यकता होगी" मैं यह कैसे कर सकता हूं? – hedgie