系统框架异常是什么意思

咖啡豆的种类2022-07-06  25

ABP提供了处理Web应用程序异常的标准模型。

自动处理所有异常。如果是API/AJAX请求,它将向客户端返回标准格式的错误消息。自动隐藏内部详细错误并返回标准错误消息。为异常消息的本地化提供一种可配置的方式。为标准异常自动设置此异常:

当控制器动作方法的返回类型是对象结果(而不是视图结果)并且抛出异常时。当请求是AJAX(

消息格式每个错误消息都是RemoteServiceErrorResponse类的一个实例。最简单的错误JSON只有一个消息属性,如下所示:

{ #34;错误 # 34;: { #34;消息 # 34;: #34;该主题已被锁定,无法添加新消息 # 34;}}其他可选字段可以根据已经发生的异常来填写。

错误错误代码(code)是异常信息中唯一的可选字符串值。抛出的异常应该实现IHasErrorCode接口来填充这个字段。JSON示例如下:

{ #34;错误 # 34;: { #34;代码 # 34;: #34;app:010042 # 34;, #34;消息 # 34;: #34;该主题已被锁定,无法添加新消息 # 34;}}错误代码也可以用于异常信息的本地化和定制。

错误详细信息错误的详细信息是一个可选属性。抛出的异常应该实现IHasErrorDetails接口来填充该字段。JSON示例如下:

{ #34;错误 # 34;: { #34;代码 # 34;: #34;app:010042 # 34;, #34;消息 # 34;: #34;该主题已被锁定,无法添加新消息 # 34;, #34;详情 # 34;: #34;关于错误的更详细的信息...#34;}}验证错误当抛出的异常实现IHasvalidationErrors接口时,validationErrors是一个可以填充的标准字段。JSON示例如下:

{ #34;错误 # 34;: { #34;代码 # 34;: #34;app:010046 # 34;, #34;消息 # 34;: #34;您的请求无效,请更正并重试!#34;, #34;验证错误 # 34;: [{ #34;消息 # 34;: #34;用户名的最小长度应为3。#34;, #34;成员 # 34;: [#34;用户名 # 34;] }, { #34;消息 # 34;: #34;需要密码 # 34;, #34;成员 # 34;: [#34;密码 # 34;]}}}} ABPValidationexception已经实现了IHasValidationErrors接口,当请求输入无效时框架会自动抛出这个错误。因此,除非您有自定义验证逻辑,否则不需要处理验证错误。

日志中捕获的异常将自动记录在日志中。

日志级别默认情况下,记录异常级别为错误。您可以通过实现IHasLogLevel接口来指定日志级别,例如:

公共类MyException : Exception,IHasLogLevel { public log level log level { get;设置;} = LogLevel。警告;//...}异常自定义日志某些异常类型可能需要记录额外的日志信息。您可以通过实现IExceptionWithSelfLogging接口来记录指定的日志,例如:

公共类myexception: exception,iexceptionwithselfmlogging { public void log(I logger logger){//...logadditionalnfo}}扩展方法ILogger。LogException用于记录异常日志。必要时可采用同样的延伸方法。

业务异常大多数异常都是业务异常。您可以使用IBusinessException接口将异常标记为业务异常。

BusinessException不仅实现了ihaserrorcode、ihaserrordetails、ihasroglevel接口,还实现了IBusinessException接口。它的默认日志级别是警告。

您通常会将错误代码与特定的业务异常相关联。例如:

抛出新的BusinessException(QaErrorCodes。CanNotVoteYourOwnAnswer);Qaerrorcodes。cannotvoteyourownanswer是一个字符串常量。建议使用以下错误代码格式:

code-namespace:error-code code-namespace,应该保证在指定的模块/应用层是唯一的。例如:

沃洛。Qa:010002Volo。Qa在这里被用作代码命名空间。代码命名空间也可用于本地化异常信息。

可以直接抛出BusinessException异常,也可以根据需要从该类派生出自己的异常类型。对于BusinessException类型,其所有属性都是可选的。但是,通常会设置ErrorCode或Message属性。异常本地化这里有一个问题,就是错误消息发送到客户端时如何本地化。总部基地提供两种模式。

用户友好异常如果异常实现了IUserFriendlyException接口,ABP不会修改消息和细节属性,而是直接发送给客户端。

UserFriendlyException类是内置IUserFriendlyException接口的实现。示例如下:

抛出新的user friendly exception( # 34;用户名应该是唯一的!#34;);这种方法不需要本地化。如果需要本地化消息,可以注入string localizer(参见本地化文档)来实现。例如:

抛出新的user friendly exception(_ string localizer[ # 34;usernameshouldbuniquemessage # 34;]);然后在本地化资源中为每种语言添加相应的定义。例如:

{ #34;文化 # 34;: #34;恩 # 34;, #34;短信 # 34;: { #34;usernameshouldbuniquemessage # 34;: #34;用户名应该是唯一的!#34;} }字符串本地化程序支持参数化信息。例如

抛出新的user friendly exception(_ string localizer[ # 34;usernameshouldbuniquemessage # 34;, #34;约翰 # 34;]);其本地化文本如下:

#34;usernameshouldbuniquemessage # 34;: #34;用户名应该是唯一的!#39;{0}#39;已经有人了!#34;IUserFriendlyException接口派生自IBusinessException,而UserFriendlyException类派生自BusinessException类。

使用错误代码UserFriendlyException很容易,但在一些高级用法中,它有以下问题:

必须在引发异常的地方注入字符串localizer以实现本地化。但是,在某些情况下,可能没有注入字符串localizer(例如,在静态上下文或实体方法中),则可以通过使用错误代码而不是抛出异常来处理本地化。

首先,将代码命名空间映射到模块配置代码中的本地化资源:

服务。configurebpexceptionlocalizationoptions(options = { options。MapCodeNamespace( # 34;沃洛。Qa # 34,type of(QA resource));});然后,Volo的命名空下的所有异常。Qa将由相应的本地化资源进行本地化。本地化资源应该包含相应错误代码的文本。例如:

{ #34;文化 # 34;: #34;恩 # 34;, #34;短信 # 34;: { #34;沃洛。QA:010002 # 34;: #34;你不能投票给你自己的答案!#34;}}最后,您可以抛出包含错误代码的业务异常:

抛出新的business exception(QaDomainErrorCodes。CanNotVoteYourOwnAnswer);为实现IHasErrorCode接口而引发的所有异常都具有相同的行为。因此,错误代码的本地化不是BusinessException类所独有的。没有必要为错误消息定义本地化文本。否则,ABP将向客户端发送默认的错误消息,而不是exception的消息属性。如果要发送异常消息,请使用UserFriendlyException(或实现IUserFriendlyException接口的异常类型)来使用消息的格式化参数。如果有参数化的错误消息,可以使用exception的Data属性来设置。例如:

抛出新的business exception( # 34;app:010046 # 34;){ Data = { { # 34用户名 # 34;, #34;约翰 # 34;} }};还有一种更快的方法:

抛出新的business exception( # 34;app:010046 # 34;) .with data( # 34;用户名 # 34;, #34;约翰 # 34;);以下是包含用户名参数的错误消息:

{ #34;文化 # 34;: #34;恩 # 34;, #34;短信 # 34;: { #34;app:010046 # 34;: #34;用户名应该是唯一的。#39;{用户名} # 39;已经有人了!#34;}}WithData支持带多个参数的链调用(比如。带数据(...).带数据(...)).

状态代码:

对于AbpAuthorizationException:用户未登录,返回401(未通过身份验证)。用户已经登录,但当前访问未被授权,返回403(未授权)。为AbpValidationException返回400(错误请求)。为EntityNotFoundException返回404(未找到)。为IBusinessException和IUserFriendlyException(是IBusinessException的扩展)返回403(未授权)。对于NotImplementedException,返回501(未实现)。对于其他异常(基础结构中未定义),返回500(内部服务器错误)。我

自定义映射可以覆盖HTTP状态代码的自动映射。例子如下:

服务。ConfigureAbpException);});的内置异常框架会自动引发以下异常类型:

当用户没有执行该操作的权限时,将引发AbpAuthorizationException异常。如果当前请求的输入无效,将抛出AbpValidationException。如果请求的实体不存在,将引发EntityNotFoundException。这个异常大部分是由存储库抛出的。您也可以在代码中抛出这些类型的异常(尽管很少需要这样做)

向客户端发送异常详细信息。您可以通过AbpExceptionHandlingOptions类的SendExceptionsDetailsToClients属性向客户端发送异常:

services.ConfigureAbpExceptionHandlingOptions(options ={ options.SendExceptionsDetailsToClients = true;});服务。configurebpexceptionhandlingoptions(options = { options。sendexceptionsdailstoclients = true;});

转载请注明原文地址:https://juke.outofmemory.cn/read/612424.html

最新回复(0)