【问题标题】:Handling exceptions during localizing in .net5在 .net5 中本地化期间处理异常
【发布时间】:2021-05-15 09:19:31
【问题描述】:
我想问一下本地化过程中是否可以处理异常?例如,我最近在我的 resx 文件中犯了错误,我的本地化程序导致在一种语言中用户出错(在翻译版本中,我写了类似“foo {2} bar”而不是“foo {0} bar”的内容。我会喜欢处理本地化程序返回“未翻译”字符串的异常。
是否可以为本地化程序编写某种特殊的异常处理程序?它应该实现任何接口还是什么?
非常感谢您的回答。
【问题讨论】:
标签:
c#
asp.net-core
error-handling
asp.net-core-localization
【解决方案1】:
我认为您可能需要使用 OnResourceExecuted() 自定义资源过滤器。
过滤器类型
每个过滤器类型在过滤器管道的不同阶段执行:
先运行,用于判断用户是否被授权请求。如果请求未被授权,授权过滤器会短路管道。
授权后运行。
OnResourceExecuting 在过滤器管道的其余部分之前运行代码。例如,OnResourceExecuting 在模型绑定之前运行代码。
OnResourceExecuted 在管道的其余部分完成后运行代码。
在调用动作方法之前和之后立即运行代码。
可以更改传递给动作的参数。可以更改从动作返回的结果。
Razor 页面不支持。
将全局策略应用于在响应正文被写入之前发生的未处理异常。
在执行动作结果之前和之后立即运行代码。它们仅在操作方法成功执行时运行。它们对于必须围绕视图或格式化程序执行的逻辑很有用。
The following diagram 显示过滤器类型如何在过滤器管道中交互。
【解决方案2】:
我使用一种更简单的方法,没有任何中间件,我将异常消息翻译成本地化字符串,如下所示,
使用原始异常消息调用您的 catch 中的方法
捕获(异常索引)
{
return Json(new { success = false, responseText = Models.SiteUtils.FriendlyErrorMessage(dex) });
}
错误消息的本地化方法,将搜索异常消息并获取您的版本,
注意我使用 Message.Contains(x.OriginalError) 所以我不需要完全翻译他的整个消息,如果你需要根据自己的逻辑,你可以决定使用完全匹配
public static string FriendlyErrorMessage(Exception dex)
{
var Message = dex.Message;
var listOfStrings = new tblErrorMsgMappingVM().GetAll().ToList();
var ErrorMessage = listOfStrings.Find(x => Message.Contains(x.OriginalError));
if (ErrorMessage != null)
{
Message = ErrorMessage.ErrorMessage;
}
else
Message = "Unknown Error ,pelase review the log";
var value = new tblLocalizationRecordsVM().GetResourceValue(Message, "ErrorMsg");
return value;
}