如何在执行程序集中手动引发内置异常时检测它是否被抛出?

4

在我的代码中,有很多区域我们手动"throw" InvalidOperationException异常。我们有特定的处理程序来处理这种异常类型。但是有一个要求,我们必须根据异常是否是由throw引起的还是来自系统而编写一些逻辑。以下是示例:

 static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Hello World!");
                //throwFirstLayer(); //if i uncomment this i am throwing the error manually
                var people = new List<Person>();

                people.Add(new Person("John", "Doe"));
                people.Add(new Person("Jane", "Doe"));
                people.Sort(); //Suppose in this line system throws InvalidOp exception
                foreach (var person in people)
                    Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
            }
            
            catch(InvalidOperationException ioex)
            {
                var e = ioex;
            }
}

public static void throwFirstLayer()
        {
            throw new InvalidOperationException("manual");
        }

 public class Person
    {
        public Person(String fName, String lName)
        {
            FirstName = fName;
            LastName = lName;
        }

        public String FirstName { get; set; }
        public String LastName { get; set; }
    }

我希望在catch块内检测异常是由我手动从代码中抛出还是系统由于实际的无效操作引发的?


请问您能否编辑您的帖子以修复缩进?目前它有些混乱,导致不必要的滚动并使阅读变得更加困难。 - Jon Skeet
1
每个异常都源自于一个抛出操作。也许你的意思是无论是在你自己的代码中还是在其他程序集(系统或第三方)中进行了抛出操作? - Klaus Gütter
准确地说,@KlausGütter - RyanDotnet
2个回答

4

您应该首先创建自己的异常类:

   public class MyInvalidOperationException : Exception
   {

   }

当需要时,抛出自定义异常(手动创建)。

throw new MyInvalidOperationException();

我知道更改异常类是最好的选择,但在当前解决方案中,我必须在许多区域进行更改,而我正在尝试避免这种情况。 - RyanDotnet
1
那么你的应用程序设计存在一个根本性的缺陷。我建议你投入必要的时间来纠正它,然后从更健壮的设计实现中继续前进。这将在应用程序开发路径上进一步产生回报。 - silkfire
只需使用一个IDE来替换所有文件。例如vscode => CTRL+SHIF+F(在文件中查找) throw new InvalidOperationException( 改为 throw new MyInvalidOperationException(。没有其他更好的方法。@RyanDotnet - AliReza Sabouri
@AliReza..请求您在回答之前先阅读并理解问题,这将节省我们双方的时间 :)。问题是是否有办法检测异常是从我的代码还是从任何系统/外部库中抛出的。 - RyanDotnet

4

您可以检查异常的堆栈跟踪,看看它来自哪里 - 但这很慢,并且由于JIT优化,在生产中容易出现错误。

我会质疑首先需要这样设计的智慧,但如果您确实非常需要这样做,我建议创建一个从InvalidOperationException派生的特定类 - 确保您只抛出那个类(而不是普通的 InvalidOperationException),然后您可以检查任何给定实例是否具有您的自定义异常类型的具体类型。


谢谢Jon。我知道更改异常类是最好的选择,但在当前解决方案中,我必须对许多区域进行更改,而我正在尝试避免这种情况。 - RyanDotnet
@RyanDotnet:最好的选择是避免需要这样的设计 - 我至少会坚持确保不良设计的实现不以脆弱的方式完成。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接