我有一个Haskell程序,我在一年前写过,直到几个月前一直运行良好。
改变了什么?该程序使用SpreadsheetML(我是其中的贡献者)构建一系列Excel报告文件,并将其作为附件发送给用户列表。该程序由逗号分隔的文本文件控制,其中每行代表一个报告,包含报告标题,数据库关键字列表(以|分隔)和收件人电子邮件地址列表(也以|分隔)。
三个月前,该文件进行了重组,以更改生成的报告以及分发给谁。从那时起,文件中的一行正在以管道错误的方式查杀程序。程序的错误消息是:
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
...转换为&#34;销售 - 欧洲 - 非洲&#34;的报告标题。以及数据库关键字和电子邮件收件人列表。如果我将报告标题更改为&#34; TEST&#34;有用;但是,在同一个文件中还有另一行,其中报告标题为&#34; Sales-North-South-Americas&#34;并且该报告运行良好。
有人看到我错过了吗?
答案 0 :(得分:1)
解决!
通过环形交叉过程,我发现只需从原始源重建应用程序就可以解决问题。要完成重建,我必须重新安装几个依赖项,但原始代码中没有一个字符被更改。
新的可执行文件没有此处报告的问题。感谢大家的建议。