Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Winforms C#库出错时退出应用程序_Winforms_Exception Handling_Error Handling_Exit - Fatal编程技术网

Winforms C#库出错时退出应用程序

Winforms C#库出错时退出应用程序,winforms,exception-handling,error-handling,exit,Winforms,Exception Handling,Error Handling,Exit,我承认这是一个愚蠢的问题。所以,如果这浪费了你的时间,我深表歉意,但我无法找到解决办法 具有类库的WinForm应用程序。我使用log4netdll记录信息 单击按钮时,我调用类库中的一个函数,该函数可能会抛出错误。因此,函数的内容在try-catch-finally块中。在catch中,我编写日志语句(使用log4netdll) 现在,发生了一个错误,我希望向UI显示一条消息。显示消息后,我希望它退出 如何将控件从类库的catch块传递回表单代码,以便显示一条消息,然后退出?在类库的异常处理程

我承认这是一个愚蠢的问题。所以,如果这浪费了你的时间,我深表歉意,但我无法找到解决办法

具有类库的WinForm应用程序。我使用log4netdll记录信息

单击按钮时,我调用类库中的一个函数,该函数可能会抛出错误。因此,函数的内容在try-catch-finally块中。在catch中,我编写日志语句(使用log4netdll)

现在,发生了一个错误,我希望向UI显示一条消息。显示消息后,我希望它退出


如何将控件从类库的catch块传递回表单代码,以便显示一条消息,然后退出?

在类库的异常处理程序中记录错误后,只需调用
throw
,而无需任何参数,它将使用相同的调用堆栈等返回完全相同的异常


然后让您的表单捕获它并根据需要处理它。

在类库中的异常处理程序中记录错误后,只需调用
throw
,而不使用任何参数,它将使用相同的调用堆栈等重新显示完全相同的异常


然后让您的表单捕获它,并根据需要处理它。

在类库方法中的catch中,重新显示异常,以便它可以冒泡到表单中


在表单按钮中,单击“在try catch中包装类方法调用”,然后在catch中显示消息并退出。

在类库方法中的catch中,重新显示异常,以便它可以冒泡到表单中


在表单按钮中,单击在try catch中包装类方法调用,在catch中显示消息并退出。

库可能在记录异常后重新抛出异常

class Form 
{
    OnClick() 
    {
        try
        {
            library.Routine();
        }
        catch(Exception e)
        {
            // messagebox
            // exit
        }
    }
}

class Library 
{
    public void Routine() 
    {
        try
        {
            // stuff
        }
        catch(Exception e)
        {
            logger.error("error in routine", e);
            throw;
        }
    }
}

在记录异常后,库可能会重新抛出该异常

class Form 
{
    OnClick() 
    {
        try
        {
            library.Routine();
        }
        catch(Exception e)
        {
            // messagebox
            // exit
        }
    }
}

class Library 
{
    public void Routine() 
    {
        try
        {
            // stuff
        }
        catch(Exception e)
        {
            logger.error("error in routine", e);
            throw;
        }
    }
}

谢谢让我们假设它有两个层次。该表单调用ClassLibrary1,后者调用ClassLibrary2。如果我要在ClassLibrary2中记录错误,那么在ClassLibrary1中,我只能抛出而不能在ClassLibrary1的Catch块中进行任何记录。@Magic。我认为这会起作用,这真的取决于你。我的大多数项目都有多个级别的日志记录。我试图在大多数地方合理地组织它,以便大多数时候我的异常只记录一次。不过,在很多情况下,我宁愿冒一点冗余日志记录的风险,也不愿冒根本没有任何日志记录的风险,因此有时我会记录两次,有时甚至三次异常。就像我说的,我尽量避免使用它,但这真的取决于谁在使用这些库以及用于什么。谢谢!让我们假设它有两个层次。该表单调用ClassLibrary1,后者调用ClassLibrary2。如果我要在ClassLibrary2中记录错误,那么在ClassLibrary1中,我只能抛出而不能在ClassLibrary1的Catch块中进行任何记录。@Magic。我认为这会起作用,这真的取决于你。我的大多数项目都有多个级别的日志记录。我试图在大多数地方合理地组织它,以便大多数时候我的异常只记录一次。不过,在很多情况下,我宁愿冒一点冗余日志记录的风险,也不愿冒根本没有任何日志记录的风险,因此有时我会记录两次,有时甚至三次异常。正如我所说,我试图避免使用它,但这实际上取决于谁在使用这些库以及用于什么目的。