如果我在处理任务之前打开WaitCursor
,然后将其恢复为默认值,我通常会得到以下代码模式:
try {
Cursor.Current = Cursors.WaitCursor;
MyProcessingTask();
}
catch (Exception ex) {
Cursor.Current = Cursors.Default;
MessageBox.Show(ex.ToString());
}
finally { Cursor.Current = Cursors.Default; }
我需要在catch
块中有Cursor.Current = Cursors.Default;
,以便给MessageBox
一个要使用的默认光标。
有没有更好的方法可以在不必编写两个Cursor.Current = Cursors.Default;
语句的情况下编写此代码?
您可以创建一个一次性类并利用using
语法糖,即:
class WaitingCursor : IDisposable
{
public WaitingCursor()
{
Cursor.Current = Cursors.WaitCursor;
}
public void Dispose()
{
Cursor.Current = Cursors.Default;
}
}
用法:
try
{
using (var wcurs = new WaitingCursor())
{
MyProcessingTask();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
这个怎么样
Exception exception = null;
try
{
Cursor.Current = Cursors.WaitCursor;
MyProcessingTask();
}
catch (Exception ex)
{
exception = ex;
}
Cursor.Current = Cursors.Default;
if (exception!= null)
MessageBox.Show(exception.ToString());
尽管这看起来是一个可行的解决方案,但我还是建议保留双光标设置,因为我更希望所有异常逻辑都在Catch块中处理。
您可以在try
/catch
块中嵌套try
/finally
块:
try {
try {
Cursor.Current = Cursors.WaitCursor;
MyProcessingTask();
}
finally { Cursor.Current = Cursors.Default; }
}
catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
这是否更好可能取决于意见。它减少了一些代码重复,但(在我看来)它没有"熟悉"的外观。有人可能会在6个月后看到这一点,并将其重构回熟悉的try
/catch
/finally
结构(并在catch
块中丢失光标更改)。
顺便说一句,在这种低水平上捕获所有异常的一般模式通常是不受欢迎的。通过只显示Message
来"处理"每一个可能的异常,您就失去了潜在的调试帮助。我通常建议a)只处理代码实际有合理策略处理的特定异常,b)将所有其他异常分配给顶级异常处理程序,a)可能会显示消息,但b)还记录异常的所有相关部分,包括调用堆栈等。
吞下异常(如图所示)可能意味着应用程序不适合继续运行,但会尝试这样做。这会使最终崩溃(如果发生)更难诊断。
在现有try ... catch
语句的try
块中嵌套一个try ... finally
语句,如下所示:
try {
Cursor.Current = Cursors.WaitCursor;
try {
MyProcessingTask();
}
finally {
Cursor.Current = Cursors.Default;
}
}
catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
您可以通过扩展方法简化它:
static void ProcessWithWaitCursor(this Action task)
{
try {
Cursor.Current = Cursors.WaitCursor;
task();
}
catch (Exception ex) {
Cursor.Current = Cursors.Default;
MessageBox.Show(ex.ToString());
}
finally { Cursor.Current = Cursors.Default; }
}
那么就这样使用它:
MyProcessingTask.ProcessWithWaitCursor()
这将从您想要执行此操作的所有位置消除所有重复的代码。