Haskell 如何根据环境(生产与开发)更改快照应用程序的行为?

Haskell 如何根据环境(生产与开发)更改快照应用程序的行为?,haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,Snap中未捕获运行时异常的默认行为是显示包含错误的白色页面。这对于开发模式来说很好,但对于生产来说却非常糟糕 我将应用程序设置为捕获异常并记录错误,以便在发生错误时显示对用户更具吸引力的内容。如何更改它,使其仅在我处于生产模式时发生 app :: SnapletInit App App app = makeSnaplet "app" "An snaplet example application." Nothing $ do h <- nestSnaplet "" heist $

Snap中未捕获运行时异常的默认行为是显示包含错误的白色页面。这对于开发模式来说很好,但对于生产来说却非常糟糕

我将应用程序设置为捕获异常并记录错误,以便在发生错误时显示对用户更具吸引力的内容。如何更改它,使其仅在我处于生产模式时发生

app :: SnapletInit App App
app = makeSnaplet "app" "An snaplet example application." Nothing $ do
    h <- nestSnaplet "" heist $ heistInit "templates"
    s <- nestSnaplet "sess" sess $
                 initCookieSessionManager "site_key.txt" "sess" (Just 86400)

    d <- nestSnaplet "db" db pgsInit

    addRoutes routes

    wrapSite (<|> notFound)
    -- TODO: figure out how make this only catch errors when in production mode
    wrapSite internalServerError

    initFlashNotice h sess
    addConfig h $ mempty & scInterpretedSplices .~ userSessionSplices sess
    return $ App h s d

internalServerError :: AppHandler () -> AppHandler ()
internalServerError h =
    catch h (\ (e :: SomeException) -> do
        logError $ B.pack $ show e
        modifyResponse (setResponseCode 500)
        render "errors/500")
app::SnapletInit app
app=makeSnaplet“app”“一个snaplet示例应用程序。”无需任何操作

h编译开发模式时,有一个开发标志传递给预处理器

#ifndef DEVELOPMENT
wrapSite internalServerError
#endif
这很难看,我真的希望有更好的东西,因为它只能通过重新编译工作。

Snap提供了用于此目的的功能。此函数用于获取传递给的环境。环境默认为“devel”,但可以在运行时使用-e命令行选项进行更改。如果您像这样运行应用程序:

dist/build/myapp/myapp -e prod
notFound = do
  e <- getEnvironment
  case e of
    "devel" -> develErrorPage
    _       -> productionErrorPage
然后
getEnvironment
将返回“prod”。您可以这样使用:

dist/build/myapp/myapp -e prod
notFound = do
  e <- getEnvironment
  case e of
    "devel" -> develErrorPage
    _       -> productionErrorPage
notFound=do
e-develErrorPage
_->productionErrorPage

@cimmanon使用预处理器指令重写我的答案。很遗憾,它需要重新编译。嗯,是的,我昨晚尝试过,但是做了一个
cabalclean
+
cabalinstall
(生产)或
cabalinstall-f development
(开发)两者都会产生相同的结果:internalServerError处理程序总是在我创建异常时运行。在没有
-f development
标志的情况下编译应用程序时,我没有理由显示裸异常,因此我要寻找的是检查该标志的答案,不是运行应用程序时传入的。该函数只获取用户设置的环境字符串。你用它做什么取决于你自己。为什么不一直显示你漂亮的异常页面呢?如果出于调试目的需要更详细的信息,可以将其写入标准输出或日志文件。记录错误需要在我进行开发的整个过程中跟踪日志。这相当不方便,因为我必须刷新浏览器才能重新编译。在浏览器中显示它是获取错误的最有效方法。