c# - 错误和异常处理

标签 c# exception-handling error-handling try-catch crud

我有一个简单的原始应用程序,我想像他们所说的那样优雅地处理错误。

我只是没有尝试去捕获。在上学C#之前,我开始学习一些python,但实际上并不能完全一样。这是我的代码,

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Threading.Tasks;

namespace Crud
{
    class Program
    {
        static string conn_string = "Data Source=MY_SQLSERVER;Initial Catalog=A_DATABASE";

        private static void Create(string name, string email)
        {
            using (SqlConnection conn = new SqlConnection(conn_string))
            {
                SqlCommand cmd = conn.CreateCommand();

                cmd.CommandText = @"INSERT INTO dbo.Person (name, email)
                                    VALUES (@name, @email)";
                cmd.Parameters.AddWithValue("@name", name);
                cmd.Parameters.AddWithValue("@email", email);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }

        private static void Read()
        {
            using (SqlConnection conn = new SqlConnection(conn_string))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT id, name, email FROM dbo.Person ORDER BY id";
                conn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        Console.WriteLine("{0}\t{1}\t{2}", dr.GetInt32(0), dr.GetString(1), dr.GetString(2));
                }
                conn.Close();
            }
        }


        private static void Update(int id, string name, string email)
        {
            using (SqlConnection conn = new SqlConnection(conn_string))
            {
                SqlCommand cmd = conn.CreateCommand();

                cmd.CommandText = @"UPDATE dbo.Person SET name=@name, email=@email
                                    WHERE id = @id";
                cmd.Parameters.AddWithValue("@id", id);
                cmd.Parameters.AddWithValue("@name", name);
                cmd.Parameters.AddWithValue("@email", email);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }

        private static void Delete(int id)
        {
            using (SqlConnection conn = new SqlConnection(conn_string))
            {
                SqlCommand cmd = conn.CreateCommand();

                cmd.CommandText = @"DELETE FROM dbo.Person WHERE id=@id";
                cmd.Parameters.AddWithValue("@id", id);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Please Enter a Command (Create, Read, Update or Delete)");
            string input = Console.ReadLine();

            if (input == "Read" || input == "read")
            {
                Read();
                Console.WriteLine("");
            }
            else if (input == "Create" || input == "create")
            {
                Console.WriteLine("Enter a name");
                string name = Console.ReadLine();
                Console.WriteLine("Enter an email address");
                string email = Console.ReadLine();

                Create(name, email);
                // Assuming Create has not yet returned an error, everything successful
                Console.WriteLine("Entry Created Successfully!");
            }
            else if (input == "Update" || input == "update")
            {
                int id;
                bool check;
                do
                {
                    Console.WriteLine("What id would you like to change?");
                    string val = Console.ReadLine(); 
                    check = int.TryParse(val, out id);
                } while (!check);
                Console.WriteLine("Enter a name");
                string name = Console.ReadLine();
                Console.WriteLine("Enter an email address");
                string email = Console.ReadLine();

                Update(id, name, email);
                Console.WriteLine("Entry Updated Successfully!");
            }
            else if (input == "Delete" || input == "delete")
            {
                int id;
                bool check;
                do
                {
                    Console.WriteLine("What id would you like to delete?");
                    string val = Console.ReadLine(); 
                    check = int.TryParse(val, out id);
                } while (!check);

                Delete(id);
                Console.WriteLine("Entry Deleted Successfully :(");
            }
        }
    }
}

它可以工作,但是很脆弱。这是一个控制台应用程序,有一天我将变成一个html解决方案,但是...

我不确定在哪里放置try catch块,也不知道在哪里放置异常。然后我在msdn上,他们告诉我他们最后使用了。最后,我能理解的东西。因此,来自python我会说尝试显然是相同的,c Sharp中的catch (){}就像python中的except:一样,但是我没有在python中使用参数。我真是个菜鸟。我认为我可以在.NET中使用Exception对象,但是我不需要它。我只是想写一条自定义消息,如果发生任何错误...我的意思是,写href有多难?我只是无法使其正常工作。

所以我的问题是,考虑到我想将try catch块保留在每个crud操作中,我将如何构造Create方法?

最佳答案

基本的C#异常处理:

try
{
    //do stuff
}
catch 
{
    //write custom exception message
}
finally
{
    //this is not necessary, but would be here
}
catch块将捕获以上示例中的所有异常。如果您想做一些异常(exception)处理,可以执行以下操作:
catch (Exception e)
{
    //do something with e
}

在您的情况下,它看起来像:
private static void Create(string name, string email)
    {
        try
        {
            using (SqlConnection conn = new SqlConnection(conn_string))
            {
                SqlCommand cmd = conn.CreateCommand();

                cmd.CommandText = @"INSERT INTO dbo.Person (name, email)
                                    VALUES (@name, @email)";
                cmd.Parameters.AddWithValue("@name", name);
                cmd.Parameters.AddWithValue("@email", email);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }
        catch
        {
            //print custom error message
        }
    }

关于c# - 错误和异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187432/

相关文章:

c# - 如何在 C# 中获取异常类型

c# - ServiceController 关闭 IIS 安全访问

javascript - @符号打破 Angular 表达

c# - 自排序列表框

c# - 将前导零添加到小于 1 的值

exception-handling - Visual Studio 2015 wdk 10 命令行错误

java - 具有未检查异常与已检查异常的接口(interface)声明

python - 为什么我的代码打开另一个文件并处理错误异常?

excel - 使用 VBA 以编程方式忽略 Excel 中的 'Number Stored as Text' 错误

c++ - 为什么添加两个空格会产生错误的输出?