如何处理抛出异常?

时间:2021-03-11 06:03:32
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

namespace NetProduct.DataAccess
{
    public class Common
    {
        private static SqlConnection conn = new SqlConnection();
        private static SqlCommand comm = new SqlCommand();

        ..................
        //执行sql语句的静态方法
        public static void ExecuteSql(string byvSql)
        {
            try
            {
                openConnection();
                comm.CommandType = CommandType.Text;
                comm.CommandText = byvSql;
                comm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);   //这里抛出异常了,信息为:String or binary data would be truncated.The statement has been terminated.
            }
            finally
            {
                closeConnection();
            }
        }
        //显示提示信息的静态方法
        public static void showMsgBox(string strMessage, Page pagethis)
        {
            string strScript = "";
            strScript += "<script language=\"javascript\">";
            strScript += " alert(\"" + strMessage + "\");";
            strScript += "</script>";
            if (!pagethis.Page.ClientScript.IsStartupScriptRegistered("showMsgBox"))
                pagethis.Page.ClientScript.RegisterStartupScript(pagethis.GetType(), "showMsgBox", strScript);
        }


    }

}

//添加按钮代码
protected void btnAdd_Click(object sender, EventArgs e)
{
    .................
    ..........
    string sql = "insert into person(person_no,person_name,Sex,Address)"+
                 "values(" + person_no + "," + person_name + "," + sex + "," + address + ")";
    try
    {
        DataAccess.Common.ExecuteSql(sql);  //在这里调用的静态方法ExecuteSql
        bind();
    }
    catch (Exception e1)
    {
        DataAccess.Common.showMsgBox(e1.Message , this); //--->类Common抛出的异常,在这里什么处理?
    }
}

我的目的是想通过语句DataAccess.Common.showMsgBox(e1.Message , this)来显示类Common抛出的异常信息
也就是显示出提示信息:
String or binary data would be truncated.The statement has been terminated.

但虽然有点长,但是很简单!
谢谢各位!

21 个解决方案

#1


把你DATAACCESS里的try catch 去掉 不就可以在页面里显示了吗?

#2


openConnection(); 
comm.CommandType = CommandType.Text; 
comm.CommandText = byvSql; 
comm.ExecuteNonQuery(); 
closeConnection();                 

#3


大哥sql错了啊
string sql = "insert into person(person_no,person_name,Sex,Address)"+ 
                "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 

#4


尽量别直接拼接字符串,还是使用带参数的存储过程吧
这样很容易注入的!!

#5


 if (!pagethis.Page.ClientScript.IsStartupScriptRegistered("showMsgBox")) 
                pagethis.Page.ClientScript.RegisterStartupScript(pagethis.GetType(), "showMsgBox", strScript ,true); 

加个true试试

#6


还有就是为什么不把提示信息的方法写在页面层
而写在数据访问层那

#7


catch (Exception e1) 
    { 
        //DataAccess.Common.showMsgBox(e1.Message , this); //--->类Common抛出的异常,在这里什么处理? 
        //首先可以不处理,就是注释掉,
         //或者将错误信息发送到页面
    }

#8


引用 3 楼 Teng_s2000 的回复:
大哥sql错了啊 
string sql = "insert into person(person_no,person_name,Sex,Address)"+ 
                "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 


在sql语句前面已经做处理了,如变量person_no的值前后都已经加单引号了;
现在不是sql语句的问题,而是什么处理被调用类抛出的异常信息



#9


报这种异常错误的原因一般是因为你向数据库里插数据时,字段类型设置的太小,比如数据库里是varchar(10),但你插了20个字符

#10


引用 6 楼 llsen 的回复:
还有就是为什么不把提示信息的方法写在页面层 
而写在数据访问层那

写到另一个类也可以,考虑到经验调用,要共享,暂时把它写到这个类里

#11


引用 9 楼 amandag 的回复:
报这种异常错误的原因一般是因为你向数据库里插数据时,字段类型设置的太小,比如数据库里是varchar(10),但你插了20个字符

那看看这个呢

#12


把try...catch去掉,设置个断点,看看错在哪儿了吧

#13


string sql = "insert into person(person_no,person_name,Sex,Address)";

  sql +=     "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 

#14


引用 9 楼 amandag 的回复:
报这种异常错误的原因一般是因为你向数据库里插数据时,字段类型设置的太小,比如数据库里是varchar(10),但你插了20个字符


我知道可以限制输入字符串的长度.....

现在是测试,我目的是什么处理异常?什么得到被调用类抛出的异常信息?

#15


e1.Message
就是错误信息啊.
直接弹出他就行了啊?

#16


引用 13 楼 zzxap 的回复:
string sql = "insert into person(person_no,person_name,Sex,Address)"; 

  sql +=    "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 

变量的值前后要有单引号,这一点已经有代码处理了,只是没有帖出来.....

既然被调用的类已经抛出了异常,那么调用者就要处理抛出的异常,没错吧?

#17


引用 16 楼 hdhai9451 的回复:
既然被调用的类已经抛出了异常,那么调用者就要处理抛出的异常,没错吧? 

OK

#18


Exception objErr = Server.GetLastError().GetBaseException();
string err =objErr.Message;


另:应该采用全局异常处理的方法。出现异常应该跳转到异常处理页面。

讲解

DEMO

#19


变量的值前后要有单引号,这一点已经有代码处理了,只是没有帖出来..... 

既然被调用的类已经抛出了异常,那么调用者就要处理抛出的异常,没错吧? 
==
这取决与你的设计, 在正常情况下最好是调用者处理抛出的异常

#20


按原代码,当运行到这句:DataAccess.Common.showMsgBox(e1.Message, this);
e1.Message返回的字符信息是:
"String or binary data would be truncated.\r\nThe statement has been terminated."

错误提示:
出现了运行时间错误
是否要进行调试?

行:315
错误:未结束的字符串常量

#21


现在原因找到了,上面返回的字符串中包含有"\r\n"
这个错误信息要在javascript中显示出来,因为包含转义符"\r\n"而错误,
也就是javascript不识别转义符;
把这个转义符替换掉就好了

...............
.....
string sql = "insert into person(person_no,person_name,Sex,Address)"+
             "values(" + person_no + "," + person_name + "," + sex + "," + address + ")";
try
{
    DataAccess.Common.ExecuteSql(sql);
    bind();
}
catch (Exception e1)
{
    string strErr = e1.Message.Replace("\r\n","");   -->要加一行代码,去掉转义符
    DataAccess.Common.showMsgBox(strErr, this);
}

OK,结帖!

#1


把你DATAACCESS里的try catch 去掉 不就可以在页面里显示了吗?

#2


openConnection(); 
comm.CommandType = CommandType.Text; 
comm.CommandText = byvSql; 
comm.ExecuteNonQuery(); 
closeConnection();                 

#3


大哥sql错了啊
string sql = "insert into person(person_no,person_name,Sex,Address)"+ 
                "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 

#4


尽量别直接拼接字符串,还是使用带参数的存储过程吧
这样很容易注入的!!

#5


 if (!pagethis.Page.ClientScript.IsStartupScriptRegistered("showMsgBox")) 
                pagethis.Page.ClientScript.RegisterStartupScript(pagethis.GetType(), "showMsgBox", strScript ,true); 

加个true试试

#6


还有就是为什么不把提示信息的方法写在页面层
而写在数据访问层那

#7


catch (Exception e1) 
    { 
        //DataAccess.Common.showMsgBox(e1.Message , this); //--->类Common抛出的异常,在这里什么处理? 
        //首先可以不处理,就是注释掉,
         //或者将错误信息发送到页面
    }

#8


引用 3 楼 Teng_s2000 的回复:
大哥sql错了啊 
string sql = "insert into person(person_no,person_name,Sex,Address)"+ 
                "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 


在sql语句前面已经做处理了,如变量person_no的值前后都已经加单引号了;
现在不是sql语句的问题,而是什么处理被调用类抛出的异常信息



#9


报这种异常错误的原因一般是因为你向数据库里插数据时,字段类型设置的太小,比如数据库里是varchar(10),但你插了20个字符

#10


引用 6 楼 llsen 的回复:
还有就是为什么不把提示信息的方法写在页面层 
而写在数据访问层那

写到另一个类也可以,考虑到经验调用,要共享,暂时把它写到这个类里

#11


引用 9 楼 amandag 的回复:
报这种异常错误的原因一般是因为你向数据库里插数据时,字段类型设置的太小,比如数据库里是varchar(10),但你插了20个字符

那看看这个呢

#12


把try...catch去掉,设置个断点,看看错在哪儿了吧

#13


string sql = "insert into person(person_no,person_name,Sex,Address)";

  sql +=     "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 

#14


引用 9 楼 amandag 的回复:
报这种异常错误的原因一般是因为你向数据库里插数据时,字段类型设置的太小,比如数据库里是varchar(10),但你插了20个字符


我知道可以限制输入字符串的长度.....

现在是测试,我目的是什么处理异常?什么得到被调用类抛出的异常信息?

#15


e1.Message
就是错误信息啊.
直接弹出他就行了啊?

#16


引用 13 楼 zzxap 的回复:
string sql = "insert into person(person_no,person_name,Sex,Address)"; 

  sql +=    "values('" + person_no + "','" + person_name + "','" + sex + "','" + address + "')"; 

变量的值前后要有单引号,这一点已经有代码处理了,只是没有帖出来.....

既然被调用的类已经抛出了异常,那么调用者就要处理抛出的异常,没错吧?

#17


引用 16 楼 hdhai9451 的回复:
既然被调用的类已经抛出了异常,那么调用者就要处理抛出的异常,没错吧? 

OK

#18


Exception objErr = Server.GetLastError().GetBaseException();
string err =objErr.Message;


另:应该采用全局异常处理的方法。出现异常应该跳转到异常处理页面。

讲解

DEMO

#19


变量的值前后要有单引号,这一点已经有代码处理了,只是没有帖出来..... 

既然被调用的类已经抛出了异常,那么调用者就要处理抛出的异常,没错吧? 
==
这取决与你的设计, 在正常情况下最好是调用者处理抛出的异常

#20


按原代码,当运行到这句:DataAccess.Common.showMsgBox(e1.Message, this);
e1.Message返回的字符信息是:
"String or binary data would be truncated.\r\nThe statement has been terminated."

错误提示:
出现了运行时间错误
是否要进行调试?

行:315
错误:未结束的字符串常量

#21


现在原因找到了,上面返回的字符串中包含有"\r\n"
这个错误信息要在javascript中显示出来,因为包含转义符"\r\n"而错误,
也就是javascript不识别转义符;
把这个转义符替换掉就好了

...............
.....
string sql = "insert into person(person_no,person_name,Sex,Address)"+
             "values(" + person_no + "," + person_name + "," + sex + "," + address + ")";
try
{
    DataAccess.Common.ExecuteSql(sql);
    bind();
}
catch (Exception e1)
{
    string strErr = e1.Message.Replace("\r\n","");   -->要加一行代码,去掉转义符
    DataAccess.Common.showMsgBox(strErr, this);
}

OK,结帖!