当前位置: 首页 > 编程笔记 >

C#异常反模式

督俊雅
2023-03-14
本文向大家介绍C#异常反模式,包括了C#异常反模式的使用技巧和注意事项,需要的朋友参考一下

示例

吞咽异常

应该始终以以下方式重新引发异常:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw;
}

重新抛出如下所示的异常将混淆原始异常,并丢失原始堆栈跟踪。一个人绝对不要这样做!捕获和重新抛出之前的堆栈跟踪将丢失。

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw ex;
}

棒球异常处理

人们不应该使用异常代替常规的流控制结构,例如if-then语句和while循环。这种反模式有时称为“棒球异常处理”。

这是反模式的示例:

try
{
    while (AccountManager.HasMoreAccounts())
    {
        account = AccountManager.GetNextAccount();
        if (account.Name == userName)
        {
            //我们找到了
            throw new AccountFoundException(account);
        }
    }
}
catch (AccountFoundException found)
{
    Console.Write("这是您的帐户详细信息: " + found.Account.Details.ToString());
}

这是一种更好的方法:

Account found = null;
while (AccountManager.HasMoreAccounts() && (found==null))
{
    account = AccountManager.GetNextAccount();
    if (account.Name == userName)
    {
        //我们找到了
        found = account;
    }
}
Console.Write("这是您的帐户详细信息: " + found.Details.ToString());

捕获(异常)

在代码中几乎没有(有人说不!)捕获通用异常类型的原因。您应该只捕获预期会发生的异常类型,因为否则会在代码中隐藏错误。

try 
{
     var f = File.Open(myfile);
     // 做点什么
}
catch (Exception x)
{
     // 假设找不到文件
     Console.Write("Could not open file");
     // 但可能由于文件处理代码中的错误而导致错误是NullReferenceException?
}

最好做:

try 
{
     var f = File.Open(myfile);
     // 做点什么 which should normally not throw exceptions
}
catch (IOException)
{
     Console.Write("File not found");
}
// 不幸的是,这个不是从上面得出的,所以单独声明
catch (UnauthorizedAccessException) 
{
     Console.Write("Insufficient rights");
}

如果发生任何其他异常,我们有意让应用程序崩溃,因此它直接进入调试器,我们可以解决问题。我们绝对不能在程序之外发生任何其他异常的情况下交付程序,因此发生崩溃不是问题。

以下示例也是一个不好的例子,因为它使用异常来解决编程错误。那不是他们设计的目的。

public void DoSomething(String s)
{
     if (s == null)
         throw new ArgumentNullException(nameof(s));
     // 实施在这里
}

try 
{    
     DoSomething(myString);
}
catch(ArgumentNullException x)
{
    // 如果发生这种情况,我们会出现编程错误,我们应该检查
    // 为什么myString首先是null。
}
           

 类似资料:
  • 集成百度移动统计后报错 Q:集成百度移动统计后,开始没什么问题,但最近一段时间每次运行都会先打印出一堆错误信息,并且会重复好多遍 A:造成这种情况是由于sdk捕获异常。可能是网络环境不稳定引起的日志发送失败,网络环境正常的话会自行恢复。可以再继续观察一下,如果仍有问题,可以将问题发送至apptongji@baidu.com 会有专人为您解答。 为什么自定义事件被归入[未知]? Q:为什么自定义事件

  • 问题内容: 异常存储在哪里?堆,堆。如何为异常分配和释放内存?现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象? 问题答案: 我假设为异常分配的内存分配方式与所有其他对象(在堆上)分配方式相同。 这曾经是个问题,因为您不能为OutOfMemoryError分配内存,这就是直到Java 1.6之前 才没有堆栈跟踪的原因。现在,它们也为stacktrace预分配了空间。 如果您想知道在抛

  • 在electron打包的时候或者运行electron-builder install-app-deps的时候会报错,有人遇到这样子的问题了吗 node版本是 21.2.0 electron版本是29.4.3 electron-builder是24.13.3 不知道是不是那些C++的包导致的,help! 我rebuild了之后还是不行

  • 在application.dispatcher.catchException(配置文件, 或者可通过Yaf_Dispatcher::catchException(true))开启的情况下, 当Yaf遇到未捕获异常的时候, 就会把运行权限, 交给当前模块的Error Controller的Error Action动作, 而异常或作为请求的一个参数, 传递给Error Action. 在Error A

  • 主要内容:try/catch语句,C#中的异常类,自定义异常类,抛出异常在 C# 中,异常是在程序运行出错时引发的,例如以一个数字除以零,所有异常都派生自 System.Exception 类。异常处理则是处理运行时错误的过程,使用异常处理可以使程序在发生错误时保持正常运行。 C# 中的异常处理基于四个关键字构建,分别是 try、catch、finally 和 throw。 try:try 语句块中通常用来存放容易出现异常的代码,其后面紧跟一个或多个 catch 语句

  • 异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。 throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。 catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。 try