我有一个Haskell程序,一年前写的,一直运行得很好,直到几个月前。发生了什么?该程序使用SpreadsheetML(我是其中的贡献者)构建一系列Excel报表文件,并将其作为附件发送给用户列表。该程序由逗号分隔的文本文件控制,其中每行表示单个报表,包含报表标题、数据库关键字列表(用|分隔)和收件人电子邮件地址列表(也用|分隔)。
三个月前,该文件进行了重构,以更改生成的报表以及分发给谁。从那时起,该文件中的一行导致程序出现了一个“broken pipe”错误。程序的错误信息如下:
该程序接受一个命令行参数来控制是否发送报告。如果该参数为False,则永远不会调用sendReport方法,也不会报错。因此,我认为在调用sendReport之前的所有内容都是正确的。以下是产生错误的代码:
当错误被报告时,邮件确实被发送了,但没有附上Excel文件。此外,在报告错误之后,程序退出,其下面的任何行都不被处理。
导致崩溃的报告驱动程序文件中的行是:
三个月前,该文件进行了重构,以更改生成的报表以及分发给谁。从那时起,该文件中的一行导致程序出现了一个“broken pipe”错误。程序的错误信息如下:
CreateExcel: fd:7: hPutBuf: resource vanished (Broken pipe)
该程序接受一个命令行参数来控制是否发送报告。如果该参数为False,则永远不会调用sendReport方法,也不会报错。因此,我认为在调用sendReport之前的所有内容都是正确的。以下是产生错误的代码:
makeAddress :: String -> Address
makeAddress addr = Address Nothing (T.pack addr)
sendReport :: String -> [String] -> String -> IO ()
sendReport file to title = do
simplemail <- simpleMail (Address Nothing (T.pack ""))
(Address Nothing (T.pack ""))
(T.pack ("CDC/Groth Training Report: " ++ title))
(L.pack ("The attachment contains your training report for" ++ title ++ "."))
(L.pack ("The attachment contains your training report for <u>" ++ title ++ "</u>."))
[(T.pack "application/xml", file)]
let mail = simplemail { mailFrom = Address (Just (T.pack "Order Fulfillment")) (T.pack "order_fulfillment@brindlewaye.com"),
mailTo = map makeAddress to,
mailCc = [],
mailBcc = [Address (Just(T.pack "Dave Smith")) (T.pack "dave@brindlewaye.pair.com")] }
mailStream <- renderMail' mail
sendmail mailStream
当错误被报告时,邮件确实被发送了,但没有附上Excel文件。此外,在报告错误之后,程序退出,其下面的任何行都不被处理。
导致崩溃的报告驱动程序文件中的行是:
Sales-Europe-Africa, Sales/Thijssen|Sales/Pecqueur|Sales/van den Bos|Sales/Zuyderduyn|Sales/Marksman, user1@example.com|user2@example.com
...这段文字中提到了一个报告标题为“销售-欧洲-非洲”,并列出了数据库关键词和电子邮件收件人。如果我将报告标题更改为“测试”,它可以正常工作;但是,在同一文件中还有另一行,报告标题为“销售-南北美洲”,该报告也可以正常运行。
有人看出我错过了什么吗?