【问题标题】:Hiding exceptions and printing decent message [closed]隐藏异常并打印体面的消息[关闭]
【发布时间】:2014-04-03 10:43:51
【问题描述】:

我在 asp.net 中编写了一个 Web 服务,它只是通过存储过程将值插入到表中。网络服务通过安卓应用程序访问。我的服务应该只返回 TRUE(在插入的情况下)或 FALSE(在插入失败的情况下),但它也可能引发看起来很奇怪且普通用户无法理解技术术语的错误(异常),因此如何隐藏这些详细信息并显示正确的消息(或重定向)。可能有很多错误,例如超出范围异常、NullException 等。

网络服务:

public GPSWebservice () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public bool insertCoordinates(string param) 
    {
        BLL bll = new BLL();
        return bll.InsertCoordinates(param);
    }

}

BLL

public bool InsertCoordinates(string param) 
    {

        String[] parts = param.Split(',');
        sqlCom.CommandText = "InsertCoordinates";
        sqlCom.CommandType = CommandType.StoredProcedure;
        bool result ;

        sqlCom.Parameters.Add("@AddedDateTime", SqlDbType.VarChar).Value = Convert.ToDateTime(parts[0].ToString());
        sqlCom.Parameters.Add("@IMEI", SqlDbType.VarChar).Value = parts[1].ToString();
        sqlCom.Parameters.Add("@RecordedDateTime", SqlDbType.VarChar).Value = Convert.ToDateTime(parts[2].ToString());
        sqlCom.Parameters.Add("@Latitude", SqlDbType.VarChar).Value = parts[3].ToString(); ;
        sqlCom.Parameters.Add("@Longitude", SqlDbType.VarChar).Value = parts[4].ToString(); ;
        sqlCom.Parameters.Add("@IsParking ", SqlDbType.Bit).Value = ((parts[5].ToString().Trim()).Equals("0")) ? false : true;
        SqlParameter sqlParam = new SqlParameter("@result", SqlDbType.Int);
        sqlCom.Parameters.Add(sqlParam);
        sqlCom.Parameters["@result"].Direction = ParameterDirection.Output;

        try
        {
            sqlCon.Open();
            sqlCom.ExecuteNonQuery();
            return result = Convert.ToBoolean(sqlParam.Value);
        }



        catch (Exception ex)
        {

            return false; 

        }

        finally 
        {
            sqlCon.Close();
        }

    }
}

SP:

ALTER PROCEDURE [dbo].[InsertCoordinates]

    @AddedDateTime varchar(50),
    @IMEI varchar(50),
    @RecordedDateTime varchar(50),
    @Latitude varchar(50),
    @Longitude varchar(50),
    @IsParking bit,
    @result int output
AS

BEGIN

    SET NOCOUNT ON;
   Begin Try

    If Not exists(select IMEI from dbo.Coordinates where IMEI =@IMEI AND Latitude=@Latitude AND @Longitude=@Longitude)
    Begin
        insert into dbo.Coordinates 
        values (@AddedDateTime, @IMEI, @RecordedDateTime, @Latitude, @Longitude, @IsParking) 

        Set @result = @@ROWCOUNT

        IF(@result = 1)
         Select @result
        Else
         Set @result=0
         Select @result
    End

    Else
    Begin
         Set @result=0
         Select @result
    End
   End Try

   Begin Catch
        Set @result=0
   End Catch

END 

【问题讨论】:

    标签: c# asp.net sql .net


    【解决方案1】:

    视情况而定。

    您可以捕获特定类型的异常并将其“翻译”为人类可读的内容。

    try
    {
         // do stuff
    }
    catch (OracleException ex)
    {
        if (ex.Code == 15) throw new MyApplicationException("Something your users might make sense of", ex); // Code==15 is made-up
    }
    // Catch more specific errors where you know what happened and can give meaningful information to the user
    catch (Exception ex)
    {
        throw new MyApplicationException("General error message: Something went horribly wrong", ex);
    }
    

    替代方法是不返回布尔值,而是返回自定义类型:

    public class ServiceResult
    {
        public bool Success { get; set; }
        public string Message { get; set; }
    }
    
    public ServiceResult InsertCoordinates(string param) 
    {
        // ... code
    
        try
        {
            sqlCon.Open();
            sqlCom.ExecuteNonQuery();
            return new ServiceResult() { Success = True };
        }
        catch (Exception ex)
        {
            return new ServiceResult() { Success = False, Message = "Crash & Burn!" }; 
        }
        // ... more code
    }
    

    哪个更好取决于您的架构以及您希望如何使用服务结果。

    【讨论】:

    • 先生,我已经很厌倦了,你能为我设置密码吗?
    • 太棒了,先生,太棒了,但我不明白的一件事是如何向用户显示 MESSAGE 属性?在屏幕上 ?来自服务
    • 取决于您的技术,如果您使用 AJAX 调用 WebMethod,则应该有一个成功处理程序:$.ajax(...).done(function(msg) { console.log(msg.Success + ": " + msg.Message); });
    • 我的意思是如何从服务中传递它,而我的服务被android应用程序消耗
    • 就像你会返回布尔值一样:[WebMethod] public ServiceResult insertCoordinates(string param)。你必须为 Android 的东西创建一个新问题,因为我对此一无所知。
    【解决方案2】:

    你可以这样做:

    public enum ErrorCode
    {
       NoError,
       DatabaseError,
       UnknownError,
       OutofrangeError
    }
    [WebMethod]
    public ErrorCodes insertCoordinates(string param) 
    {
        ErrorCodes result = ErrorCodes.NoError;
        try
        {
            BLL bll = new BLL();
            bool dbResult = bll.InsertCoordinates(param);
            if (!dbResult) {result = ErrorCodes.DatabaseError;}
        }
        catch (OutOfRangeException ex) {result = ErrorCodes.OutofrangeError;}
        catch (Exception ex) {result = ErrorCodes.UnknownError;}
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2010-11-22
      相关资源
      最近更新 更多