由于某种原因,我有一个无限期失败的事务,我想在里面使用跟踪指令.例如,要在执行此片段中的事务之前打印MVar的状态:
data_out <- atomically $ do
rtg_state <- takeTMVar ready_to_go
JobDescr hashid url <- T.readTBChan next_job_descr
case rtg_state of
Ready_RTG n -> do
putTMVar ready_to_go $ Processing_RTG n
putTMVar start_harvester_browser hashid
putTMVar next_test_url_to_check_chan hashid
putTMVar next_harvest_url hashid
return (n,hashid,url)
_ -> retry
Run Code Online (Sandbox Code Playgroud)
这会使程序出现段错误还是错过行为?
只要您trace用于调试目的,您应该没问题.作为一般规则,只要假设在程序的最终生产就绪版本中就没有trace了.
你永远不会观察到段错误trace.它的"不安全"源于它在纯代码中注入可观察的效果.例如,在STM中,当事务重试时,假定其效果被回滚.如果trace用于向用户发送消息,则无法回滚.如果输出trace触发导弹发射,你将不得不处理国际副作用.如果trace相反只是用"FYI,代码正在做X"向开发人员发出信号,这不是程序核心逻辑的一部分,并且非常好.