如何从处理程序引发异常

阿米泰布

我正在构建一个RESTful端点,如果存在无效数据,该端点应该引发错误。这是一个简化的(有点傻)的版本:

getEventsR :: Handler Value
getEventsR = do
    mpage   <- lookupGetParam "page"
    let filters = case hasPage mpage of
                      Right val -> val
                      Left val  -> error $ T.unpack val -- Throw an error

     -- The rest...


hasPage :: Maybe Text -> Either Text Text
hasPage = 
    Left "This should error out"
  1. 这是正确的方法Either-函数应返回,随后将其扩展为错误?
  2. 我可能不应该使用error,对吧?什么呢?

附带说明一下,如果抛出的错误也以JSON格式发送,我会很高兴。

更新:

之所以使用“抛出异常”一词,是因为我的代码看起来像这样(简化):

let selectOpt = case addPager [] of
                    Right val -> val
                    Left val  -> error $ T.unpack val

let filters = case addFilter [] of
                    Right val -> val
                    Left val  -> error $ T.unpack val

events <- runDB $ selectList filters selectOpt :: Handler [Entity Event]

因此,如果出现错误,selectOpt我希望它短路,而不要继续处理程序的其余部分。

埃里克

您可以使用sendResponseStatus直接指定响应:

getEventsR = do
  mpage   <- lookupGetParam "page"
  case hasPage mpage of
    Left message -> sendResponseStatus status400 message
    Right val    -> ...continue processing with val...

的第二个参数sendResponseStatus可以是具有ToTypedContent实例的任何类型这包括TextValue和其他常见的类型。有关默认情况下已定义此实例的类型,请参见此页面

更新

回应您的评论...

get404 定义为:

get404 key = do
    mres <- get key
    case mres of
        Nothing -> notFound'
        Just res -> return res

notFound' :: MonadIO m => m a
notFound' = liftIO $ throwIO $ HCError NotFound

HCError是以下HandlerContents类型的构造函数

http://hackage.haskell.org/package/yesod-core-1.4.0/docs/Yesod-Core-Types.html#t:HandlerContents

data HandlerContents:
    HCContent Status !TypedContent   
    HCError ErrorResponse    
    HCSendFile ContentType FilePath (Maybe FilePart)     
    HCRedirect Status Text   
    HCCreated Text   
    HCWai Response   
    HCWaiApp Application

AnErrorResponse具有以下构造函数:

data ErrorResponse:
    NotFound     
    InternalError Text   
    InvalidArgs [Text]   
    NotAuthenticated     
    PermissionDenied Text    
    BadMethod Method    

因此,您可以throwIO限制数量的错误,并且错误消息仅限于Text

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何处理引发检查异常的静态最终字段初始化程序

我应该如何处理SwingUtilities.invokeAndWait引发的异常

Spring Boot异常处理程序:引发异常

如何在NUnit中处理引发的异常

如何处理事件处理程序引发的域事件?

Web API 2-返回NotFound(); 与使用全局异常处理程序引发异常

访问异常时,过滤后的异常处理程序中的代码将引发NullReferenceException

如何处理Monix onErrorHandle中未处理的异常引发

如何集中处理DataProvider方法中引发的异常

如何处理跨执行边界的libstdc ++引发异常

pdb事后调试:在异常处理程序中退出后跳转到引发异常

我该如何处理Process.run引发的异常

@Consumes批注引发异常,如何处理

如何处理在较低级别的程序包或函数调用时引发的异常?

处理异常时引发异常

在上下文处理程序中重新引发异常

如果对函数的调用引发异常,如何继续处理?

引发异常时如何安全地处理数组指针

如何处理PHP 5.4中的方法引发的异常?

终止引发异常的处理程序

如何处理为未定义函数引发的异常?

我应该如何处理WCF服务中引发的异常?

处理程序如何从引发PermissionDenied('info')异常中获取信息?

如何处理DbTransaction的Commit()或Rollback()引发异常?

未处理的异常处理程序如何对异常调度进行更改?

如何处理从Undertow工作线程引发的异常?

如何处理关闭文件引发的异常?

我自己的异常处理程序仍会引发异常并使应用程序崩溃

在处理可能引发异常的输入时,如何使用 while 循环?