【问题标题】:How can I create a new exception class and throw it如何创建一个新的异常类并抛出它
【发布时间】:2014-01-21 08:13:26
【问题描述】:

在 C#.NET 中,我如何创建一个新的异常类并在运行时抛出它。 我需要在运行时根据我收到的输入字符串生成异常类名称。看来我应该使用 Reflection.emit,但我不知道该怎么做。

【问题讨论】:

  • 您需要为我们提供更多背景信息。老实说,这听起来是个坏主意——你想解决什么问题?
  • 如果你在运行时生成异常类型,你怎么期望有人能够捕捉到它?除非它们捕获了其中一种基本异常类型,在这种情况下,您的异常类有什么用处?
  • @Lukazoid 我同意这似乎有点“无法使用”,但这个问题对我来说似乎很有趣。
  • @nowhewhomustnotbenamed.:我不会这么说。我想说的是,在执行时,基于一个字符串,是一种代码味道……但是声明你自己的异常类型是完全有充分理由的。
  • 我不需要捕捉它,我需要它用于测试目的(我想从封闭系统中得到一些东西)。它不会在实际程序中使用(假设是用户)。否则我意识到这是一个非常糟糕的做法。

标签: c# .net exception runtime reflection.emit


【解决方案1】:

虽然我不明白使用反射发射创建异常类型的目的,但创建异常类型与创建任何其他类型没有什么不同:

// Build an assembly ...
var appDomain = Thread.GetDomain();
var assemblyName = new AssemblyName("MyAssembly");
var assemblyBuilder = appDomain.DefineDynamicAssembly(
  assemblyName,
  AssemblyBuilderAccess.Run
);

// ... with a module ...
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");

// ... containing a class.
var typeBuilder = moduleBuilder.DefineType(
  "MyException",
  TypeAttributes.Class,     // A class ...
  typeof(Exception)         // ... deriving from Exception
);
var exceptionType = typeBuilder.CreateType();

// Create and throw exception.
var exception = (Exception) Activator.CreateInstance(exceptionType);
throw exception;

【讨论】:

    【解决方案2】:

    我认为您可以查看这篇文章是否有例外:http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

    到这个线程来解决运行时的定义问题:Creating a class for an interface at runtime, in C#

    【讨论】:

    • 答案不应该只包含链接,它们应该包含自己的必要信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2020-02-13
    • 2017-05-17
    • 1970-01-01
    • 2012-04-14
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多