小编hen*_*iny的帖子

捕获特定异常

如何使用c#捕获特定的异常?
在我的数据库中,某些列上有唯一索引.
当用户插入重复记录时,抛出此异常:

无法在对象'dbo中插入重复的键行.BillIdentity'具有独特的指数'IX _BillIdentity'.该语句已终止.

我怎么能抓住这个例外?
目前我正在检查使用此代码:

 catch (Exception ex) {
    if (ex.Message.Contains("Cannot insert duplicate key row in object 'dbo._BillIdentity' with unique index 'IX__BillIdentity")) {
        string ScriptKey = "$(function() {ShowMessage('Error');});";
        ScriptManager.RegisterStartupScript(Page, GetType(), "script", ScriptKey, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得它的味道很难闻.
有没有更好的方法?

c# refactoring exception-handling

16
推荐指数
3
解决办法
3万
查看次数

删除过多的try-catch块

我正在重构由其他开发人员编写的中型WinForms应用程序,并且几乎每个类的每个方法都被一个try-catch块包围.99%的时间这些catch只阻止记录异常或清理资源并返回错误状态.

我认为很明显,这个应用程序缺乏适当的异常处理机制,我打算删除大多数try-catch块.

这样做有什么不利之处吗?你会怎么做?我打算:

  • 要适当地记录异常并阻止它们传播给用户,请拥有一个Application.ThreadException处理程序

  • 对于需要清理资源的情况,请保留try-catch块

更新:使用usingtry-finally阻止是一种更好的方法.谢谢你的回复.

  • 在"return-false-on-error"的方法中,让异常传播并在调用者中捕获它

欢迎任何更正/建议.

编辑:在第3项中,"return-false-on-error"我的意思是这样的方法:

bool MethodThatDoesSomething() {
    try {
       DoSomething(); // might throw IOException
    } catch(Exception e) {
       return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想把它重写为:

void MethodThatDoesSomething() {
   DoSomething(); // might throw IOException
}

// try-catch in the caller instead of checking MethodThatDoesSomething's return value
try {
   MethodThatDoesSomething()
} catch(IOException e) {
   HandleException(e);
}
Run Code Online (Sandbox Code Playgroud)

c# exception-handling try-catch winforms

9
推荐指数
1
解决办法
1679
查看次数

哪个"C#实验语言功能"是这个?

在下面的示例中,Resharper在第一个花括号上显示"C#实验语言功能"工具提示.我已经检查了C#6.0的新功能,但没有遇到类似的功能.什么是参考实验功能?

 class Class1
 {
     { // <= C# Experimental language feature
     }
 }
Run Code Online (Sandbox Code Playgroud)

注意:.Net Framework 4.5编译器是错误的.

"类,结构或接口成员声明中的无效标记'{'"

c# language-features c#-6.0

9
推荐指数
1
解决办法
2074
查看次数

无法使用yield return打印到控制台

在下面的测试中,我无法在使用yield return时真正打印Console.WriteLine.我正在尝试收益率回报,我理解我对它的理解中缺少了一些东西,但却无法弄清楚它是什么.为什么不打印里面的字符串PrintAllYield

码:

class Misc1 {
    public IEnumerable<string> PrintAllYield(IEnumerable<string> list) {
        foreach(string s in list) {
            Console.WriteLine(s); // doesn't print 
            yield return s;
        }
    }
    public void PrintAll(IEnumerable<string> list) {
        foreach(string s in list) {
            Console.WriteLine(s); // surely prints OK
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

[TestFixture]
class MiscTests {
    [Test]
    public void YieldTest() {
        string[] list = new[] { "foo", "bar" };
        Misc1 test = new Misc1();

        Console.WriteLine("Start PrintAllYield");
        test.PrintAllYield(list);
        Console.WriteLine("End PrintAllYield");

        Console.WriteLine();

        Console.WriteLine("Start PrintAll");
        test.PrintAll(list);
        Console.WriteLine("End PrintAll");
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# yield-return

4
推荐指数
1
解决办法
440
查看次数

SaveFileDialog没有在新线程中显示?

我很长一段时间都对这个问题感到困惑.我使用System.Threading启动新线程,就像这样:

ParameterizedThreadStart threadFileExport = FileExport;
Thread threadExport = new Thread(threadFileExport)
{
    IsBackground = true,
    Name = "threadExport",
    Priority = ThreadPriority.AboveNormal
};
threadExport.Start(_dataTable);
Run Code Online (Sandbox Code Playgroud)

public void FileExport(object objTable)
{

     SaveFileDialog saveFileDialog = new SaveFileDialog
     {
         DefaultExt = "xlsx",
         Filter = "Excel 2007-2010|*.xlsx|" +
                  "Excel95,97,2003|*.xls|",
         FileName = "table.xlsx",
         Title = "Save as. . ."
     };
saveFileDialog.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

但是对话框不会显示,并且在执行"ShowDialog"时线程似乎会立即中止.这是一个错误还是我弄错了?后台线程可以显示保存文件对话框吗?

c# multithreading dialog winforms

1
推荐指数
1
解决办法
2907
查看次数

c#/ .net文本框行为

我偶尔遇到的东西我不知道为什么会发生

如果我在按钮点击事件中采用一行简单的代码:

textbox1.Text = textbox2.Text;
Run Code Online (Sandbox Code Playgroud)

单击按钮时,textbox1中的文本消失,textbox2不会更新.两个文本框都将EnableViewState设置为true.

如果在页面加载时textbox1为null,则如果已从页面加载中的数据库填充,则textbox2将采用textbox1中的文本.

似乎无法在网上找到合适的解释,任何人都可以评论吗?

谢谢

.net c# asp.net textbox

0
推荐指数
1
解决办法
252
查看次数

应用程序不显示在任务栏中

我的项目是在C#.Net中,我们不想在任务栏上显示所选的应用程序.即具有UI,但客户希望它不应显示在任务栏上.

你能以任何方式提出建议吗?

@Edited问题

.net c# windows

0
推荐指数
1
解决办法
85
查看次数