2016年8月9日火曜日

Visual Studio 2013でVsPackageを作る

2013ではaddin機能が無くなり、VsPackageになった。

VsPackageのSDKをダウンロードし
新規プロジェクトをVsPackageで作成する。

プログラムを記述してビルドし
binのフォルダーに作成される.vsixファイルを
ダブルクリックすることでインストールできる。

2016年5月23日月曜日

catchしたExceptionの再スロー

C#でtry~catchを行うとき、catchブロックでthrowのみ書いてるソースがあったので
意味あんのか?ってことで調べてみた。

自分の認識では関数内のExceptionは最終的に.Net Frameworkが受けてくれるので
単にthrowするだけなら意味がないように思う。

ということで、スタックトレースがどう違うかを比べてみた。

①Hoge1~3はtry~catchを行わず、呼び出し元でtry~catchしてみる。
#region Hoge
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        Hoge();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("********Hoge*********");
        Console.WriteLine(ex.ToString());
    }
}

private void Hoge()
{
    Hoge1();
}


private void Hoge1()
{
    Hoge2();
}

private void Hoge2()
{
    Hoge3();
}

private void Hoge3()
{
    throw new DivideByZeroException();
}
#endregion

②Foo1~3はtry~catchを行ない、catch句ではthrow;のみする

#region Foo
private void button2_Click(object sender, EventArgs e)
{
    try
    {
        Foo();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("********Foo*********");
        Console.WriteLine(ex.ToString());
    }
}

private void Foo()
{
    try
    {
        Foo1();
    }
    catch
    {
        throw;
    }
}

private void Foo1()
{
    try
    {
        Foo2();
    }
    catch
    {
        throw;
    }
}

private void Foo2()
{
    try
    {
        Foo3();
    }
    catch
    {
        throw;
    }
}

private void Foo3()
{
    throw new DivideByZeroException();
}
#endregion
③Func1~3はtry~catchを行ない、catch句ではthrowされたExceptionをさらにthrowする
#region Func
private void button3_Click(object sender, EventArgs e)
{
    try
    {
        Func();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("********Func*********");
        Console.WriteLine(ex.ToString());
    }
}

private void Func()
{
    try
    {
        Func1();
    }
    catch (DivideByZeroException ex)
    {
        throw ex;
    }
}

private void Func1()
{
    try
    {
        Func2();
    }
    catch (DivideByZeroException ex)
    {
        throw ex;
    }
}

private void Func2()
{
    try
    {
        Func3();
    }
    catch(DivideByZeroException ex)
    {
        throw ex;
    }
}

private void Func3()
{
    throw new DivideByZeroException();
}
#endregion

結果

********Hoge*********
System.DivideByZeroException: 0 で除算しようとしました。
   場所 WindowsFormsApplication1.Form1.Hoge3() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 53
   場所 WindowsFormsApplication1.Form1.Hoge2() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 48
   場所 WindowsFormsApplication1.Form1.Hoge1() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 43
   場所 WindowsFormsApplication1.Form1.Hoge() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 37
   場所 WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 25
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)


結果

 ********Foo*********
System.DivideByZeroException: 0 で除算しようとしました。
   場所 WindowsFormsApplication1.Form1.Foo3() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 110
   場所 WindowsFormsApplication1.Form1.Foo2() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 104
   場所 WindowsFormsApplication1.Form1.Foo1() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 92
   場所 WindowsFormsApplication1.Form1.Foo() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 80
   場所 WindowsFormsApplication1.Form1.button2_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 62
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)

③結果

********Func*********
System.DivideByZeroException: 0 で除算しようとしました。
   場所 WindowsFormsApplication1.Form1.Func() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 137
   場所 WindowsFormsApplication1.Form1.button3_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 119



■結論
ということで、 catch句で何かしらの処理を行うならアリだが、単にthrow;だけなら不要。
③のパターンはスタックトレースが最後のthrow分しか残ってないので最悪。

普通に①でやるのがよさげ。

2016年4月18日月曜日

IIS 7.5 FTPで550 Access Denied

1.FTPにログインするユーザーに該当フォルダの書き込み権限を与える
2.FTPの管理画面、FTPの承認規則で書き込みにチェックを入れる