Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在没有异常类的情况下抛出自定义异常_C#_Asp.net_Exception - Fatal编程技术网

C# 有没有一种方法可以在没有异常类的情况下抛出自定义异常

C# 有没有一种方法可以在没有异常类的情况下抛出自定义异常,c#,asp.net,exception,C#,Asp.net,Exception,在C#(即.NET)中是否有任何方法可以抛出一个自定义异常,但不编写所有代码来定义自己从异常派生的异常类 我在想一些类似的东西,比如在oraclepl/SQL中,您可以简单地编写 raise_application_error(-20001, 'An arbitary error message'); 在任何地方 throw new Exception("A custom message for an application specific exception"); 不够好 如果相关,还可

在C#(即.NET)中是否有任何方法可以抛出一个自定义异常,但不编写所有代码来定义自己从
异常派生的异常类

我在想一些类似的东西,比如在oraclepl/SQL中,您可以简单地编写

raise_application_error(-20001, 'An arbitary error message');
在任何地方

throw new Exception("A custom message for an application specific exception");
不够好

如果相关,还可以抛出更具体的异常。比如说,

throw new AuthenticationException("Message here");

我可以工作

请注意,根据,您可能不应该抛出新的ApplicationException()

不自定义异常的主要缺点是调用方更难捕获-如果不对Exception.Message属性进行一些古怪的检查,他们将不知道这是一般异常还是特定于代码的异常。您可以做如下简单的事情:

public class MyException : Exception
{
    MyException(int severity, string message) : base(message)
    {
        // do whatever you want with severity
    }
}
为了避免这种情况


更新:Visual Studio 2015现在提供了一些异常扩展类的自动实现-如果您打开快速操作和重构菜单,光标位于
:异常
,只需告诉它“生成所有构造函数”。

您只需抛出.NET中可用的一个异常即可:

throw new System.ArgumentException("Parameter cannot be null", "original");
或更通用:

throw new ApplicationException("File storage capacity exceeded.");
简言之,答案是否定的

强制执行自定义异常的继承有很好的理由;人们需要能够处理这些问题。如果您可以在没有类型的情况下抛出自定义异常,那么人们将无法捕获该异常类型


如果不想编写自定义异常,请使用现有异常类型。

异常类不是抽象的
类,并且与.NET中定义的大多数异常一样,在一个构造函数重载中使用
字符串消息
,因此可以使用现有异常类型,但是有一个定制的消息

throw new Exception("Something has gone haywire!");
throw new ObjectDisposedException("He's Dead, Jim");
throw new InvalidCastException(
    $"Damnit Jim I'm a {a.GetType().Name}, not a {b.GetType().Name}!");

因为这使用了已知的异常类型,所以第三方也可以更容易地扩展库,因为他们不需要在
catch
语句中查找
MyArricryException

在c中创建自定义异常的一种简单方法是使用泛型类。如果您需要创建大量异常(即,如果您需要在单元测试中区分它们),那么这将大大减少代码行数

首先创建一个名为
CustomException
的简单类:

如果要引发自定义异常,请使用:

throw new CustomException<MyCustomException>("your error description");
抛出新的CustomException(“您的错误描述”);
这使异常代码保持简单,并允许您区分这些异常:

try
{
    // ...
}
catch(CustomException<MyCustomException> ex)
{
    // handle your custom exception ...
}
catch(CustomException<SomeOtherException> ex)
{
    // handle your other exception ...
}
试试看
{
// ...
}
捕获(自定义异常)
{
//处理您的自定义异常。。。
}
捕获(自定义异常)
{
//处理其他异常。。。
}

您可以将自定义属性添加到自定义异常类中,所以您不能只创建一个自定义异常类,然后为异常的“类型”添加枚举吗?如果
抛出新异常(“任意错误消息”)对你不起作用,扩展一个问题来解释原因可能是个好主意。不,没有,也不应该有。@ZoharPeled你这么说的理由是什么?@mason:我的理性很简单:异常携带的信息比简单的信息多得多。它们携带堆栈跟踪,可以携带内部异常,等等。PL/SQL raise error不会。另一个原因是,在不使用异常对象的情况下引发错误消息会与正常的异常模式发生冲突,而.Net不为此提供try…catch机制。(您不应该使用
ApplicationException
类,请参阅此处的备注:ApplicationException实际上已被弃用。这不是OP要求的“自定义”异常。但是,我更感兴趣的是理解以下语句:“请注意,您可能不应该抛出new exception(),因为这可能会导致其他问题。”-你能进一步解释一下吗?很抱歉,把它们弄混了!现在切换到另一个位置。@MetroSmurf想一想,这是一个没有任何信息的异常发生了什么。最重要的是,如果不处理每个异常就不可能处理(
catch exception
而不是
catch specific exception
).我必须记住,
invalidcasteexception
!@David这是正确的,但是所有的异常都应该是DwightSchruteException(“…”)LOL类型
public class MyCustomException : Exception { }
public class SomeOtherException : Exception { }
throw new CustomException<MyCustomException>("your error description");
try
{
    // ...
}
catch(CustomException<MyCustomException> ex)
{
    // handle your custom exception ...
}
catch(CustomException<SomeOtherException> ex)
{
    // handle your other exception ...
}