Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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_Performance_Exception_Exception Handling - Fatal编程技术网

C# 例外问题

C# 例外问题,c#,asp.net,performance,exception,exception-handling,C#,Asp.net,Performance,Exception,Exception Handling,为了避免任何运行时错误,我始终使用异常处理程序: 详情如下: try { //My code which may raise an error. } catch (Exception ee) { string message = ee.Message; ShowMessage(); } try { //do struff here } catch (...) { //handle exception here } fin

为了避免任何运行时错误,我始终使用异常处理程序:

详情如下:

try
{
    //My code which may raise an error.
}
catch (Exception ee)
{
            string message = ee.Message;
            ShowMessage();
} 
try
{
    //do struff here
}
catch (...)
{
    //handle exception here
}
finally
{
    //clean up here
}

我的问题是:

  • 这被认为是好的做法还是坏的做法?(我用同样的方法 (一直在排队)

  • 每次声明字符串时,性能问题是什么

  • 当使用返回值的方法使用这些行时 一定是在抓到之后才回来


  • 您应该首先处理已知问题以提高性能,例如空引用、空字符串等

    对例外情况使用例外

    声明
    字符串
    在这里并不是一件坏事,但除了保存另一个引用之外,它什么都不做

    您可以安全地从
    try
    块返回。但正如Damokles所说,您还应该在其他地方返回另一个返回。

    这是错误的代码。其实很糟糕

    由于您对错误消息所做的只是将其分配给从未使用过的字符串,因此实际上您只是捕获异常并忽略它。这几乎是处理异常时最糟糕的事情,因为程序将继续运行,好像什么都没有发生一样,很可能是数据不可用或损坏

    捕获异常时:

    • 使用更具体的异常类型,例如SqlException或IOException,以便只捕获要捕获的异常,并且知道如何处理

    • 捕获异常时,要么真正处理它,要么重新处理它,以便可以在不同级别处理它


    您应该只捕获预期的异常,并知道如何处理它们。通过
    catch(Exception)
    在一个方法中捕获所有类型的异常不是一个好的做法

    您可以捕获所有异常,只需记录它们或在失败时重新启动应用程序

    比如说

    try
    {
        //My code which may raise an error.
    }
    catch (FileNotFoundException)//you are expecting this exception
    {
        //handle file not found here.
    }
    catch (Exception ee)
    {
        string message = ee.Message;
        Log(message);
        throw;//rethrow the exception
    } 
    

    不需要在所有函数中添加异常处理程序。在main()处添加异常处理,它封装了所有函数。仅在您打算执行某些特定异常处理操作以防止应用程序崩溃的位置添加异常处理程序


    可以在try块中添加返回值。

    我假设您这样做是为了忽略异常?在这种情况下,您可以这样做:

    try
    {
    // code
    }
    catch {} 
    
    这将捕获所有异常并对其不做任何处理(忽略)


    但是,我不建议这样做,因为您现在永远不会知道为什么系统中的某些功能不能按预期工作,因为不会抛出错误。然后,我建议至少将异常记录下来,以便以后可以对问题进行故障排除。更好的方法是记录异常并重新抛出它,然后在UI层进行友好的异常处理。

    这被认为是一种不良做法,因为您基本上忽略了异常。你甚至没有向用户展示它

    这甚至是双重错误,因为在代码上复制粘贴相同的行也是一种错误的做法

    建议使用处理异常,或根本不触摸它。由于代码知道如何处理异常是相当罕见的,所以常见的情况是根本不捕获它

    当然,在主循环中,您将有一个try-catch,它将记录异常和/或向用户报告异常


    关于第二个问题:是的,返回语句可以是catch块的一部分。但是如果您不知道返回什么,则不应捕获异常

    异常处理的一般结构如下所示:

    try
    {
        //My code which may raise an error.
    }
    catch (Exception ee)
    {
                string message = ee.Message;
                ShowMessage();
    } 
    
    try
    {
        //do struff here
    }
    catch (...)
    {
        //handle exception here
    }
    finally
    {
        //clean up here
    }
    
    在您的代码中需要注意的几件事并非完全正确(事实上它们很糟糕:p):

  • 只捕获您准备好处理的异常,而不处理您不准备处理的异常。这意味着您应该只捕获您知道在异常情况下可能发生的特定异常(
    FileNotFoundException
    ArgumentOutOfRangeException
    ,等等)(永远不要将异常处理用作正常执行流工具)。捕获
    系统。异常
    被认为是不好的做法(除非是出于日志记录目的,并且您随后立即抛出;),因为这个
    异常
    可以被任何该死的东西抛出,很可能您在编写代码时没有预见到,因此不知道如何正确处理它

  • <> LI>

    根据您的情况,您应该考虑使用<代码>最后< /Cord>块,以便在退出方法之前清理任何可能的内容(因为它是正常执行流,或者是未处理的异常)。请注意,

    finally
    块(通常)总是在退出方法范围之前执行

  • 不要接受异常及其包含的信息。你应该考虑将它记录在某处(MyAppultual.Load文件),并向用户显示一个更友好的“我们有一个问题”的消息。否则,当生产中出现错误时,您所拥有的唯一信息将是您向用户显示的任何内容。捕获的
    异常
    中存储的所有有价值的信息都将丢失


  • 您应该在这里搜索一下,这样就有无数关于异常处理和最佳实践的示例。如果你不做任何处理,你的
    消息
    将毫无用处。但是他需要在finally或try块之后返回默认值。非常感谢,但是当我将返回值放入
    try
    块时,它会给我一个编译器错误,
    并不是所有的代码路径都返回值
    。但是如果任何运行时错误,我不把我的考虑放在是否会发生,错误会出现在用户身上??!!以错误的上下文方式。@just_name:这是您应该在应用程序级别处理的异常类型。对于处理未处理的页面的web应用程序,除了