在 .net5 中本地化期间处理异常
Handling exceptions during localizing in .net5
请问是否可以在本地化过程中处理异常?例如,我最近在我的 resx 文件中犯了错误,我的本地化程序导致在一种语言中用户得到错误(在翻译版本中我写了类似“foo {2} bar”而不是“foo {0} bar”的东西)。我会喜欢处理本地化程序 returns “未翻译”字符串的异常。
是否可以为定位器编写某种特殊的异常处理程序?它应该实现任何接口还是什么?
非常感谢您的回答。
我认为您可能需要使用 OnResourceExecuted()
自定义资源过滤器。
Filter types
每种过滤器类型在过滤器管道的不同阶段执行:
- 授权过滤器
运行 首先,用于判断用户是否被授权请求。如果请求未被授权,授权过滤器会短路管道。
- 资源过滤器
运行授权后
OnResourceExecuting
运行s 过滤器管道其余部分之前的代码。例如OnResourceExecuting
运行模型绑定前的代码。
OnResourceExecuted
运行 管道其余部分完成后的代码。
- 动作过滤器
运行 调用动作方法前后的代码。
可以更改传递到动作中的参数。可以更改操作返回的结果。
Razor Pages 不支持。
- 异常过滤器
将全局策略应用于在写入响应正文之前发生的未处理异常。
- 结果过滤器
运行 动作结果执行前后的代码。它们 运行 仅当操作方法已成功执行时。它们对于必须围绕视图或格式化程序执行的逻辑很有用。
The following diagram 显示过滤器类型如何在过滤器管道中交互。
我使用了一种没有任何中间件的更简单的方法,我将异常消息翻译成本地化的字符串,如下所示,
使用原始异常消息调用 catch 中的方法
捕获(异常 dex)
{
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;
}
请问是否可以在本地化过程中处理异常?例如,我最近在我的 resx 文件中犯了错误,我的本地化程序导致在一种语言中用户得到错误(在翻译版本中我写了类似“foo {2} bar”而不是“foo {0} bar”的东西)。我会喜欢处理本地化程序 returns “未翻译”字符串的异常。
是否可以为定位器编写某种特殊的异常处理程序?它应该实现任何接口还是什么?
非常感谢您的回答。
我认为您可能需要使用 OnResourceExecuted()
自定义资源过滤器。
Filter types
每种过滤器类型在过滤器管道的不同阶段执行:
- 授权过滤器
运行 首先,用于判断用户是否被授权请求。如果请求未被授权,授权过滤器会短路管道。
- 资源过滤器
运行授权后
OnResourceExecuting
运行s 过滤器管道其余部分之前的代码。例如OnResourceExecuting
运行模型绑定前的代码。
OnResourceExecuted
运行 管道其余部分完成后的代码。
- 动作过滤器
运行 调用动作方法前后的代码。
可以更改传递到动作中的参数。可以更改操作返回的结果。
Razor Pages 不支持。
- 异常过滤器
将全局策略应用于在写入响应正文之前发生的未处理异常。
- 结果过滤器
运行 动作结果执行前后的代码。它们 运行 仅当操作方法已成功执行时。它们对于必须围绕视图或格式化程序执行的逻辑很有用。
The following diagram 显示过滤器类型如何在过滤器管道中交互。
我使用了一种没有任何中间件的更简单的方法,我将异常消息翻译成本地化的字符串,如下所示,
使用原始异常消息调用 catch 中的方法 捕获(异常 dex)
{
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;
}