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 videCatch
. 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'utilisationthrow;
. Si tout ce que vous êtes en train de faire est de re-lancer la même exception, omettre lecatch
bloquer totalement, car il ne fait rien.
Vous devez vous connecter pour publier un commentaire.
1)
conn.Close();
est pas nécessaire, étant donné l'instruction à l'aide appelleraclose
pour vous. Il est équivalent à2) L'attraper avec la forme
n'est pas recommandé dans n'importe quelle situation je pense. Il a 2 problèmes
C'est de ne rien faire sauf renvoi de l'exception. Vous n'attrapez pas l'exception, sauf si vous voulez faire quelque chose avec elle (par exemple: enregistrement de l'erreur)
Renvoi à l'exception de faire
throw ex;
coupe la trace de la pile. Quelqu'un attraper l'exception verrez l'erreur généré sur cette ligne, perdre des informations utilesthrow;
ne sera pas le faire.Vous n'avez pas besoin de la
finally { ...}
parce que leusing
va Disposer de la connexion.Votre question sur:
Est fréquent lorsque vous souhaitez enregistrer l'exception, mais encore de le jeter, il suffit de capture et de re-jeter sert à rien.
Mais devrait être fait comme ceci: