如何知道要捕获的特定异常

时间:2013-11-14 15:58:30

标签: c# .net exception

例如

try
{
    Application.Exit();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
    //throw;
}

这是一般例外。如何知道使用哪一个以及何时使用?

3 个答案:

答案 0 :(得分:4)

  

如何知道使用何时使用?

这取决于您在try区块中尝试执行的操作。假设您使用SqlCommand来检索某些记录,那么最好首先捕获SqlException然后再Exception捕获其他记录。

try
{
    using(SqlCommand cmd = new SqlCommand(....))
    {
        //........
    }
}
catch (SqlException se)
{
    //logging etc. 
}
catch (Exception ex)
{
    //logging etc
}

请记住首先捕获特定的异常并转移到基础Exception。至于你关于捕获哪个异常的问题,你无法确定它们,这就是为什么它们被称为异常,你只能相应地预测和捕获它们。

答案 1 :(得分:0)

您可以定义许多catch块。像:

        try
        {
            var result = 8 / 0;
        }
        catch (DivideByZeroException ex)
        {
            // Here, a more specific exception is caught.
        }
        catch (Exception ex)
        {
           // Otherwise, you'll get the exception here.
        }

答案 2 :(得分:0)

您希望在程序中使用结构化异常处理(SEH)。

首先,您必须注意,存在3种类型的错误:

  • 程序错误
  • 用户错误
  • 例外

所以你必须在可以创建异常的情况下在C#中使用SEH,但是在运行programm期间你无法做任何代码。在创建方法期间,如果方法无法执行请求任务时避免出现情况,则必须设置异常。在此过程中,你必须注意两个要点(如 Rihter 在他的一本书中写的那样):

首先,您必须了解可以创建什么类型的Exception。必须非常谨慎地选择此类型,为此您可以在FCL(Framework类库)中使用现有类型之一,但有时可能是这种情况,当您需要自己的异常类型时。例如,如果使用Input-Otput类,则可以使用以下异常类型之一 - System.IO.DirectoryNotFoundException, System.IO.DriveNotFoundException, System.IO.EndOfStreamException, System.IO.FileLoadException, System.IO.FileNotFoundException, System.IO.PathTooLongException, System.IO.PipeException

其次,您必须选择将哪些消息发送到异常构造函数。意味着您必须能够从您的方法中找到详细信息 - 何时以及为何创建此例外。

另外,对于创建例外,您可以使用下一个shablon

void SomeMEthod (){
try 
{
    //your code to do
}
catch (ExceptionType1) //here put code with Exception 1
{
// you can add some specific code here for working with your exception
}
catch (ExceptionType2) //here put code with Exception 2
{
// you can add some specific code here for working with your exception
}
catch (EXCEPTION) //here put code with rest types of Exception
{
// you can add some specific code here for working with your exception
}
finally
{
//here put code that allow you to free your resourses
//NOTE: this code will be launched always!
}
//here you can placed code, that will be launched if no Exception will be found
}

另请注意,EXCEPTION必须包含ExceptionType2ExceptionType1ExceptionType2必须包含ExceptionType1 - 这样您就可以使用某些hierarhy捕获异常 - 否则 - EXCEPTION将捕获所有异常。

您还可以在thow区块中添加关键字catch,以便在现有例外情况下进行双重工作

catch (EXCEPTION) //here put code with rest types of Exception
{
// you can add some specific code here for working with your exception
throw;
}

此外,您必须了解如果您使用代码捕获异常 - 您知道它可以。所以你可以把东西带走。您必须以这种方式创建代码,try-catch-funally的q-ty块正好是您的程序所需。

有关C#中的异常类的详细信息,您可以找到HERE