LemonteaのUnity部屋

UnityとかC#のおはなしです~

C# 例外処理① try catch

こんにちは。レモンティーです。

今回はC#の例外処理についてです。

「例外」というのはざっくり言うとエラーです。

例えばAndroidアプリのテストプレイ中に
0で割り算したり、配列のインデックスオーバーを起こしたりすると
「問題が発生したため、アプリを終了します」
と表示されてアプリを終了してしまいます。

まさにこれが「例外が発生している」状況です。
例外処理とはこれに対処することです。

try-catch

例外処理の一番基本的な書き方は↓のようになります。

try{

     //普通の処理。ここで例外が発生すると検出される

}catch{

 //↑で例外が発生した場合のみ実行される処理。例外への対処など。

}

tryブロック内に書かれた処理の途中で例外が発生すると
処理が中断され、catchブロックに移ります。
例外が発生しなければcatchブロックは実行されません。


例えばこんな感じです

try{

int n = 100;
string s = Console.ReadLine();
int m = int.Parse(s);
int a = n/m;
Console.WriteLine(a);

}catch{

Console.WriteLine("例外発生");

}

Console.ReadLine();

100を入力した数値で割るだけですが、入力によっては例外が発生します。
数値以外が入力された場合や、0が入力された場合です。
そのような場合、処理はcatchブロックに移り、出力は
「例外発生」となります。

それ以外ではcatchブロックは実行されず、普通に計算結果が出力されます。
2と入力したら出力は「50」です。

例外の種類ごとに処理を分ける

例外の検出はできましたが、どんな例外にも「例外発生」と表示されると
どの例外が発生したのかわかりません。
例外を区別できたら便利です。

そのためには、↓のように
例外をキャッチする際に例外のクラスを指定します。

try{

}catch(例外のクラス){
  //指定されたクラスとその派生クラスの例外にのみ反応
}

「0で割った」などの標準的な例外は
System.Exceptionから派生するクラスとして
あらかじめ定義されています。

たとえば「0で割った」は
System.DivideByZeroException です。

一覧はここで見れます
Exception クラス (System)


それでは例外の区別を実際にやってみます。

try{

int n = 100;
string s = Console.ReadLine();
int m = int.Parse(s);
int a = n/m;
Console.WriteLine(a);

}catch(System.DivideByZeroException){

Console.WriteLine("例外が発生しました。0以外を入力してください");

}catch{

Console.WriteLine("何らかの例外が発生しました");

}

Console.ReadLine();

これでcatchブロックを増やせば
例外ごとに違った適切な対処が可能ですね。

注意点としては、catchブロックは上から順に処理されることです。

そのため、もしもこのプログラムで
二つのcatchブロックの順番を入れ替えた場合、
全ての例外処理がなにも指定していないcatchブロックで行われるため
catch(System.DivideByZeroException)が実行されることは
あり得なくなってしまいます。なら書く意味ないですね。
これはコンパイルエラーになります。
何も指定しないcatchブロックは一番下に書かなければいけません。

同じ理由で、継承関係がある例外を別々に指定する場合も
親クラスのcatchブロックを下側に書かなくてはいけません。

例外の詳細を知る

例外のより詳しい情報を得るには↓のようにします

try{

}catch(System.Exception e){

                Console.WriteLine(e.Message);
                Console.Write(e.TargetSite);
                Console.WriteLine(e.StackTrace);
}

eはcatchブロック内でのみ有効な変数です。
↑のようにこれを介して例外の様々な情報にアクセスできます

Messageは例外の説明。TargetSiteは例外が発生したメソッド。
StackTraceは例外が投げられた時のメソッドよびだしのトレースです。

この場合
Messageは「0 で除算しようとしました。」となります。

コンソールアプリのMainメソッドに書いたため
TargetSiteは「Void Main(System.String[]) 」となりました。

StackTraceは長いので省きます。



これでtry-catchでいろいろな処理ができますね。
今回はこれでおしまいです。

sawalemounity.hatenablog.com

CSS はみ出した要素の処理 overflow

こんにちは。レモンティーです。

今回は、はみ出した要素をどう扱うかを選べる
overflowについてです。

この間このブログで
一つの記事を表示しているときは問題なくても
ブログのトップページで最近の記事が並んで表示されているときに
枠から中身がはみだすことがありました。

こんな感じです

わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。

したにある文ともかぶってしまいます





これを解決してくれるのがoverflowプロパティです。

overflowプロパティには以下のような値が設定できます

・visible…そのまま表示。背景色とかつけなければこれがデフォルトです。

・hidden…はみ出た部分は表示しません。

・scroll…はみ出た部分はスクロールでみれるようになります。

・auto…自動。しばしばスクロールになります。

visibleはデフォルトなので先ほどの例と同じです。
他の三つを実際にみてみます。

・hidden

わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。

・scroll

わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。

・auto

わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。


中身はこんな感じです

HTML

・hidden

<p class="test test1">わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。</p>

・scroll

<p class="test test2">わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。</p>

・auto

<p class="test test3">わくからはみだすとたいていのばあいこのようにたいへんふしぜんないんしょうをあたえます。</p>

CSS

.test{border:solid 2px black; width:180px; height:50px;}
.test1{overflow:hidden;}
.test2{overflow:scroll;}
.test3{overflow:auto;}


今回はこれでおしまいです
sawalemounity.hatenablog.com




CSS 要素が半透明に透ける opacity

こんにちは。レモンティーです。

今回は要素を半透明にします。
使うのはopacityです。

.test{opacity:0.5;}

のように書くと、指定した要素が透けます。

要素の透明度は0~1で指定でき、0に近いほど透明です。
アルファ値みたいですね。

さっそく↓を透けさせてみます。

Opacityテスト


opacity:1

Opacityテスト


opacity:0.8

Opacityテスト


opacity:0.5

Opacityテスト


opacity:0.3

Opacityテスト


opacity:0.1

Opacityテスト


opacity:0

Opacityテスト


1だと全く透過せず、0だと完全に透明で見えなくなってますね。


今回はこれでおしまいです。
sawalemounity.hatenablog.com




CSS 要素を隠す・非表示 display none と visibility hidden

こんにちは。レモンティーです。

今回は、CSSで要素の非表示をやります。
使うのは display : nonevisibility : hidden です。

これらはともに要素を見えなくしてくれますが違いがあります。
display : noneだと
そもそも存在しないかのように扱われますが

visibility : hiddenだと
表示されていた領域はあいかわらず確保されるので
本当にただ見えなくなる、という感じです。

実際にみたほうがピンときやすいかもしれません
↓の三つの四角のうち、真ん中の灰色のものを
両方のやり方で見えなくしてみます。

cubeAcubeBcubeC


display : noneの場合

cubeAcubeBcubeC


visibility : hiddenの場合

cubeAcubeBcubeC


確かにdisplay : noneの場合は無かったようになり
visibility : hiddenの場合は見えなくなっただけのようですね。

中はこうなっています

HTML

display : noneの場合
<span class="cube RED">cubeA</span><span class="cube GRAY dsp">cubeB</span><span class="cube BLUE">cubeC</span>

visibility : hiddenの場合
<span class="cube RED">cubeA</span><span class="cube GRAY vsb">cubeB</span><span class="cube BLUE">cubeC</span>

CSS

.RED{background:red;}
.BLUE{background:blue;}
.GRAY{background:gray;}
.cube{border:solid 2px black; margin:10px; padding:10px; color:white;}
.dsp{display:none;}
.vsb{visibility:hidden;}


肝心の、要素を見えなくしているのはこの部分ですね

.dsp{display:none;}
.vsb{visibility:hidden;}

これで、セレクタで指定した要素を非表示にできます。

今回はこれでおしまいです。

sawalemounity.hatenablog.com




CSS セレクタ ~ で以降の要素を指定

こんにちは。レモンティーです。

今回は~セレクタについてです。

これは↓のように書くと

X ~ Y{  }

X以降で同じ階層の全てのYにCSSを適用できます。
同じ階層、というのは親が同じということです。
つまりXと親が同じで、Xより後ろにあるYに適用されます。

たとえば次のような場合は…
HTML

<div>
<p>前のp(対象外)</p>
<a href="http://sawalemounity.hatenablog.com/archive">aタグ(記事一覧)</a>
<p></p>
<p></p>
<p></p>
<span>span(対象外)</span><br>
<p>p(間に別のタグ↑があっても関係なし)</p>
</div>

<div>
<p>別の階層のp(対象外)</p>
</div>

CSS

a ~ p{color:blue;}

…このようになります


前のp(対象外)

aタグ(記事一覧)

span(対象外)

p(間に別のタグ↑があっても関係なし)


別の階層のp(対象外)



たしかにaと同じ階層で後ろにあるpにだけ
CSSが適用されています。
関係あるのはこの条件だけで、あいだにspanやbrといった
別のタグがあってもなんら関係ありません。
慣れたら便利そうなセレクタですね。


今回はこれでおしまいです。


sawalemounity.hatenablog.com





CSS セレクタ + で隣接している要素を指定

こんにちは。レモンティーです。

今回は+セレクタについてです。

これを使うと
ある要素のうしろで隣接している要素にCSSを適用できます。

例えば

X + Y {  }

と書けば、
Xのうしろで隣接しているYにのみCSSを反映させられます。
(X Yの順番で隣接している場合に反映…といったほうが書式から見て直感的かも。)

次のような場合では…
HTML

<p>p</p>
<p>p</p>
<div>div</div>
<p>p</p>
<p>p</p>

CSS

div + p {color:blue;}

…↓のようになります。

p

p

div

p

p


今回はこれでおしまいです
sawalemounity.hatenablog.com





HTML リストをつくる olとulとli

こんにちは。レモンティーです。

今回はリストの作成についてです。
つかうのはOL・UL・Liの3種類のタグです。

OLOrdered Listの略で
名前の通り、順番に数字がついたリストです。

ULUnordered Listの略で
順番の数字無しのリストです。

Liタグはこれらのlistの内容です。

言葉ではピンときにくいので実際に見てみます

OL
  1. あいうえお
  2. かきくけこ
  3. さしすせそ
UL
  • あいうえお
  • かきくけこ
  • さしすせそ

たしかに数字の有無が違いますね。
HTMLは↓のようになっていて、olとulが違うだけです。

<ol>
<li>あいうえお</li>
<li>かきくけこ</li>
<li>さしすせそ</li>
</ol>

<ul>
<li>あいうえお</li>
<li>かきくけこ</li>
<li>さしすせそ</li>
</ul>


さらにこれらにはTypeという属性があって
数字や黒丸を別のものに変更できます

まずはULからみてみます
ULの場合はTypeにはdisc,circle,squareのいづれかが設定できます。

例えばTypeをdiscにすると、↓のように黒丸になります。(デフォルトでした笑)

  • あいうえお
  • かきくけこ
  • さしすせそ
HTMLは↓のようになってます。

<ul type="disc">
<li>あいうえお</li>
<li>かきくけこ</li>
<li>さしすせそ</li>
</ul>

他にもcircleで白丸、squareで四角になります。

↓circle

  • あいうえお
  • かきくけこ
  • さしすせそ

↓square

  • あいうえお
  • かきくけこ
  • さしすせそ


次にOLの場合です。
OLの場合はtypeには1、A、a、I、iのいづれかが設定できます
それぞれ
数字、アルファベット大文字、アルファベット小文字、ローマ数字大文字、ロー
マ数字小文字
になります

↓のような感じです。

typeが1の場合

  1. あいうえお
  2. かきくけこ
  3. さしすせそ
typeがAの場合
  1. あいうえお
  2. かきくけこ
  3. さしすせそ
typeがaの場合
  1. あいうえお
  2. かきくけこ
  3. さしすせそ
typeがIの場合
  1. あいうえお
  2. かきくけこ
  3. さしすせそ
typeがiの場合
  1. あいうえお
  2. かきくけこ
  3. さしすせそ

今回はこれでおしまいです。
sawalemounity.hatenablog.com