为什么我基于.net6创建的wpf程序抛出的异常信息没有本地化语言?

fufu 20 信誉分
2024-08-13T08:18:41.9033333+00:00

我设计了一个wpf程序来验证.net的异常抛出是否支持本地化的语言。在我搜集资料时获得信息:
如果不需要对异常消息进行特殊处理,只要按照正常方式编写和处理异常代码,.NET 框架会根据操作系统的区域设置自动本地化异常消息。
于是我编写了以下代码在win11中文系统上运行

using System;
using System.Globalization;
using System.Threading;
using System.Windows;
namespace LanguageException
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Thread.CurrentThread.CurrentCulture = CultureInfo.CurrentCulture;
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentUICulture;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // 触发一个除以零的异常
                int result = 10 / int.Parse("0");
            }
            catch (Exception ex)
            {
                // 显示异常消息
                MessageBox.Show(ex.Message, "Exception Message", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}

我进行了debug发现culture确实设置为了zh-CN,但是异常消息仍然是英文的
Snipaste_2024-08-13_16-17-12

请问这是什么原因导致的?

Windows Presentation Foundation
Windows Presentation Foundation
.NET Framework 的一部分,它提供统一的编程模型,用于在 Windows 上构建业务线桌面应用程序。
126 个问题
.NET 运行时
.NET 运行时
.NET: 基于 .NET 软件框架的 Microsoft 技术。运行时: 运行未编译为机器语言的应用所需的环境。
53 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 48,511 信誉分 Microsoft 供应商
    2024-08-14T07:08:25.8666667+00:00

    您好,.NET 的异常消息(如“试图除以零”)通常是硬编码的,可能无法根据当前文化设置进行本地化。异常消息的本地化取决于 .NET 运行时及其资源。.NET 包含许多你可以使用的不同异常。 但是,如果它们都无法满足你的需要,则可以创建自己的自定义异常

    如果本地化对您的应用程序至关重要,请考虑实施自定义异常处理以自行提供本地化消息。

      private void Button_Click(object sender, RoutedEventArgs e)
      {
         
    
          Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
          Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");
    
          try
          {
             
              int result = 10 / int.Parse("0");
          }
          catch (Exception ex)
          {
             
              string localizedMessage = GetLocalizedExceptionMessage(ex);
              MessageBox.Show(localizedMessage, "Exception Message", MessageBoxButton.OK, MessageBoxImage.Error);
          }
      }
    
      private string GetLocalizedExceptionMessage(Exception ex)
      {
          
          if (ex is DivideByZeroException)
          {
              return "除数不能为零。"; 
          }
    
          return ex.Message; 
      }
    
    
    

    User's image


    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    1 个人认为此答案很有帮助。

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。