例外处理问题

  • 本文关键字:处理问题 c#
  • 更新时间 :
  • 英文 :


当找不到数据库行时,我正在抛出一个新的例外。

称为:

的类
public ProfileBO retrieveProfileByCode(string profileCode)
{
    return retrieveSingleProfile("profile_code", profileCode);
}
private ProfileBO retrieveSingleProfile(string termField, string termValue)
{
    ProfileBO profile = new ProfileBO();
    //Query string is temporary.  Will make this a stored procedure.
    string queryString = " SELECT * FROM GamePresenterDB.gp.Profile WHERE " + termField + " = '" + termValue + "'";
    using (SqlConnection connection = new SqlConnection(App.getConnectionString()))
    {
        connection.Open();
        SqlCommand command = new SqlCommand(queryString, connection);
        SqlDataReader reader = command.ExecuteReader();
        if (reader.Read())
        {
            profile = castDataReadertoProfileBO(reader, profile);
        }
        else
        {
            // No record was selected.  log it and throw the exception (We'll log it later, for now just write to console.)
            Console.WriteLine("No record was selected from the database for method retrieveSingleProfile()");
            throw new InvalidOperationException("An exception occured.  No data was found while trying to retrienve a single profile.");
        }
        reader.Close();
    }
    return profile;
}

但是,当我在呼叫类中捕获异常时," e"现在为null。我究竟做错了什么?我相信这在Java中可以正常工作,因此C#必须以不同的方式处理此操作。

呼叫类:

private void loadActiveProfile()
{
    try
    {
        ProfileBO profile = profileDAO.retrieveProfileByCode(p.activeProfileCode);
        txtActiveProfileName.Text = profile.profile_name;
    }
    catch (InvalidOperationException e)
    {
    }
}

现在将所有代码都放在问题中,您可以将尝试捕获移到'LoadActive -Profile'方法之外,然后将其放入'retieversingleprofile'中。

private void loadActiveProfile()
{
        ProfileBO profile = profileDAO.retrieveProfileByCode(p.activeProfileCode);
        txtActiveProfileName.Text = profile.profile_name;
    }

删除尝试捕获^

private ProfileBO retrieveSingleProfile(string termField, string termValue)
    {
      try {

        ProfileBO profile = new ProfileBO();
       //Query string is temporary.  Will make this a stored procedure.
        string queryString = " SELECT * FROM GamePresenterDB.gp.Profile WHERE " + termField + " = '" + termValue + "'";
        using (SqlConnection connection = new SqlConnection(App.getConnectionString()))
        {
            connection.Open();
            SqlCommand command = new SqlCommand(queryString, connection);
            SqlDataReader reader = command.ExecuteReader();
            if (reader.Read())                
            {
                profile = castDataReadertoProfileBO(reader, profile);
            } 
            else
            {
                // No record was selected.  log it and throw the exception (We'll log it later, for now just write to console.)
                Console.WriteLine("No record was selected from the database for method retrieveSingleProfile()");
                throw new InvalidOperationException("An exception occured.  No data was found while trying to retrienve a single profile.");
            }
            reader.Close();
        }
        return profile;
       }
      catch(InvalidOperationException e)
      { 
      }
    }

添加了尝试在正确的位置捕获。

您需要将步骤ecatch块设置为抛出的InvalidOperationException

catch (System.InvalidOperationException e)
{
int breakPoint = 0; //<- set a breakpoint here.
    //Either you reach the breakpoint and have an InvalidOperationException, or you don't reach the breakpoint.
   MessageBox.Show(e.Message);
}

还要确保您投掷的InvalidOperationException实际上是System.InvalidOperationException,而不是您的某些自定义类型,称为" InvalidoperationException"。

就像@clemens所说,您需要显示所有相关代码。

作为快速测试,这可以正常工作:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Throwing error");
            ThrowException();
        }
        catch (InvalidOperationException e)
        {
            Console.WriteLine(e.Message);
        }
        Console.ReadKey(true);
    }
    static void ThrowException()
    {
        throw new InvalidOperationException("Blah blah blah");
    }
}

最新更新