创建自己的异常并在C#

时间:2015-09-11 16:48:04

标签: c# exception custom-exceptions

我试图了解如何以正确的方式使用自定义异常。

我已经多次使用过try / catch但是从来没有说过何时使用自己的类关闭异常。我已阅读并观看了许多教程,但我无法理解这一点。

这是我的CustomException课程:

[Serializable]
    class CustomException : FormatException
    {
        /// <summary>
        /// Just create the exception
        /// </summary>
        public CustomException()
        : base() {
        }
        /// <summary>
        /// Create the exception with description
        /// </summary>
        /// <param name="message">Exception description</param>
        public CustomException(String message)
        : base(message) {
        }
        /// <summary>
        /// Create the exception with description and inner cause
        /// </summary>
        /// <param name="message">Exception description</param>
        /// <param name="innerException">Exception inner cause</param>
        public CustomException(String message, Exception innerException)
        {
        }
    }

这是我尝试使用它的地方:

    /// <summary>
    /// Checks if parse works
    /// </summary>
    /// <returns></returns>
    public static int ParseInput(string inInt)
    {
        try
        {
            int input = int.Parse(inInt);
            return input;
        }
        catch (CustomException)
        {
            throw new CustomException();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Use only numbers! " + ex.Message);
            return -1;
        }

    }

现在我做错了什么?请原因int input = int.Parse(inInt);这个程序崩溃,它永远不会出现在我的自定义异常中?如果我使用经典的Exception类,那一切都有效。

4 个答案:

答案 0 :(得分:8)

您定义的CustomException是一个比基于FormatException的更具体的类(这是继承的内容)。您无法使用更具体的异常捕获更通用的异常。只有另一种方式。

答案 1 :(得分:4)

在你的代码中,你只是在你之前捕获它时抛出你的异常类型,这种情况永远不会发生,因为系统不会抛出异常。

通常你会做这样的事情。

try
{
    // do something 
    if (some condition) 
        throw new MyCustomException() ;
} 
catch (SomeOtherException e) 
{
    // Handle other exceptions 
} 

在您的情况下,系统会抛出FormatException,但不是您自己的异常类,因为它不知道它。由于您的异常类更具体为FormatException,因此不会调用catch块。但是,它应该像这样工作:

public static int ParseInput(string inInt)
{
    try
    {
        int input = int.Parse(inInt);
        return input;
    }
    catch (FormatException e)
    {
        throw new CustomException("Format error!", e);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Use only numbers! " + ex.Message);
        return -1;
    }
}

此外,您的代码有一个缺陷:当捕获任何Exception时,将向用户显示一条消息,-1将是返回值(-1不是有效输入......? )。捕获FormatException时,通过重新抛出异常将错误处理留给被调用者 - 为什么?

请记住,例外不会“落空”:

try
{
}
catch (FormatException e1)
{
    // This will throw an exception, but it will **not** be caught here,
    // but control goes back to the caller
    throw new Exception();
}
catch (Exception e2) 
{
    // This block will not get called when an exception occurs in 
    // above handler. It will only get called when an exception other
    // than FormatException occurs.
}

答案 2 :(得分:2)

让我以一个问题开始我的答案:当代码中出现时,您认为如何捕获给定的异常?

这里的代码:

int input = int.Parse(inInt);
如果出现错误,

会抛出FormatException但不是您自己的CustomException

你必须将它扔在自己的代码中才能捕获它:

try
{
    …
    // the execution of this code needs to lead to throwing CustomException…
    throw new CustomException();
    …
}
// … for a handler of CustomException to make any sense whatsoever
catch (CustomException e)
{
    … handle here …
}

答案 3 :(得分:1)

嗯,这是因为你的案例中int.Parse(int )引发了FormatException并且对你的自定义异常一无所知(John_Snow_face.jpg)。 您可以使用TryParse方法:

int number;
bool result = Int32.TryParse(value, out number);
if(!result)
throw new CustomException("oops");