ASP.Net C# - try-catch-finally et à l'aide de relevés

J'ai donc été utilisé pour le codage avec try-catch-finally états et n'incluant pas le à l'aide de déclaration, et je vais essayer d'intégrer ces derniers dans mon code.

J'ai joint mon origine et de la version révisée du code ci-dessous. Est-ce la révision est-elle suffisante?

Aussi, concernant la capture des erreurs, j'ai vu le code suivant utilise un certain nombre de fois sur ici. Quand faut-il être utilisé/non utilisé depuis cela n'a pas d'informer les utilisateurs sur l'erreur?

catch (Exception ex)
{
    throw ex;
}

code original:

protected void signIn()
{
string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connStr);
MySqlCommand comm;
comm = new MySqlCommand("Select user_id, username, email, salt, hashed_pw, role, activated FROM users WHERE username=@username", conn);
comm.Parameters.Add("@username", MySqlDbType.VarChar);
comm.Parameters["@username"].Value = txtUsername.Text;
MySqlDataReader reader;
try
{
conn.Open();
reader = comm.ExecuteReader();
if (reader.Read())
{
string saltAndPwd = String.Concat(txtPassword.Text, reader["salt"].ToString());
string hashSaltAndPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPwd, "sha1");
if (hashSaltAndPwd.Equals(reader["hashed_pw"].ToString()))
{
if (reader["activated"].ToString().Equals("Y"))
{
Session["Username"] = reader["username"].ToString();
Session["Role"] = reader["role"].ToString();
Session["UserID"] = reader["user_id"].ToString();
Session["EmailAddress"] = reader["email"].ToString();
if (reader["role"].ToString().Equals("0"))
{
Session["PermanentRole"] = "admin";
}
else if (reader["role"].ToString().Equals("2"))
{
Session["PermanentRole"] = "tutor";
}
Response.Redirect("~/portal.aspx");
}
else
{
lblError.Text = "Your account has not been activated.  Please check your inbox and activate your account or reset your password by clicking the link above.";
}
}
else
{
lblError.Text = "Incorrect password.";
}
}
else
{
lblError.Text = "Username does not exist.";
}
reader.Close();
}
catch
{
lblError.Text = "Database connection error. Please try again.";
}
finally
{
conn.Close();
}
}

code révisé:

protected void signIn()
{
string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
using (MySqlConnection conn = new MySqlConnection(connStr))
{
using (MySqlCommand cmd = conn.CreateCommand())
{
string cmdText = "Select user_id, username, email, salt, hashed_pw, role, activated FROM users WHERE username=@username";
cmd.CommandText = cmdText;
cmd.Parameters.Add("@username", MySqlDbType.VarChar);
cmd.Parameters["@username"].Value = txtUsername.Text;
try
{
conn.Open();
reader = cmd.ExecuteReader();
if (reader.Read())
{
string saltAndPwd = String.Concat(txtPassword.Text, reader["salt"].ToString());
string hashSaltAndPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPwd, "sha1");
if (hashSaltAndPwd.Equals(reader["hashed_pw"].ToString()))
{
if (reader["activated"].ToString().Equals("Y"))
{
Session["Username"] = reader["username"].ToString();
Session["Role"] = reader["role"].ToString();
Session["UserID"] = reader["user_id"].ToString();
Session["EmailAddress"] = reader["email"].ToString();
if (reader["role"].ToString().Equals("0"))
{
Session["PermanentRole"] = "admin";
}
else if (reader["role"].ToString().Equals("2"))
{
Session["PermanentRole"] = "tutor";
}
Response.Redirect("~/portal.aspx");
}
else
{
lblError.Text = "Your account has not been activated.  Please check your inbox and activate your account or reset your password by clicking the link above.";
}
}
else
{
lblError.Text = "Incorrect password.";
}
}
else
{
lblError.Text = "Username does not exist.";
}
reader.Close();
}
catch
{
lblError.Text = "Database connection error. Please try again.";
}
finally
{
conn.Close();
}
}
}
  • "jai vu le code suivant utilise un certain nombre de fois sur ici. Quand faut-il être utilisé/non utilisé depuis cela n'a pas d'informer les utilisateurs sur l'erreur?" Non, jamais, où avez-vous vu? Ne pas le faire throw ex dans un vide Catch. Lire stackoverflow.com/questions/1234343/... et stackoverflow.com/questions/730250/...
  • Vous n'avez pas besoin de fermer la connexion, le using bloc se débrouillera pour vous (bien, techniquement, la méthode dispose de la connexion de la classe)
  • "When should this be used?" - Jamais. throw ex; ne doit jamais être utilisé comme ça. C'est de jeter utile trace de la pile de l'information. Si tout ce que vous devez faire est de re-jeter la même exception, l'utilisation throw;. Si tout ce que vous êtes en train de faire est de re-lancer la même exception, omettre le catch bloquer totalement, car il ne fait rien.
InformationsquelleAutor Bhav | 2014-08-07