수색…
소개
Rust 프로그램이 심각한 오류가 발생한 상태에 도달하면
panic!
매크로는 빨리 종료 할 때 호출 할 수 있습니다 (종종 비교되지만 약간 다른 경우 다른 언어에서는 예외가됩니다). 적절한 오류 처리에는 Result
유형이 포함되어야합니다.이 단원에서는 panic!
대해서만 설명합니다 panic!
및 그 개념.
비고
패닉이 항상 메모리 누수 또는 기타 리소스 누출을 일으키는 것은 아닙니다. 사실, 패닉은 일반적으로 RAII 불변 변수를 보존하고, 스택이 푸는 동안 구조체의 소멸자 (Drop 구현)를 실행합니다. 그러나이 과정에서 두 번째 패닉이 발생하면 프로그램이 중단됩니다. 이 시점에서 RAII 불변의 보증은 무효입니다.
당황하지 마라.
Rust에는 프로그램에서 무엇인가 잘못되었다는 것을 나타내는 두 가지 주요 메서드가 있습니다. Result<T, E>
유형 ( panic!
)에서 ( 잠재적으로 사용자 정의 된 ) Err(E)
반환하는 함수 panic!
.
패닉은 다른 언어에서 흔히 볼 수있는 예외의 대안이 아닙니다 . 녹 (Rust)에서 공포는 무언가가 심각하게 잘못되었으며 계속할 수 없다는 것을 나타내는 것입니다. push
위한 Vec
소스의 예제는 다음과 같습니다.
pub fn push(&mut self, value: T) {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.cap() {
self.buf.double();
}
...
}
메모리가 부족하면 Rust가 할 수있는 일은별로 없으므로 패닉 (기본 동작) 또는 중단 (컴파일 플래그로 설정해야 함) 중 하나입니다.
Panicking은 스택을 풀고 소멸자를 실행하고 메모리가 정리되도록합니다. Abort는 이것을하지 않으며 OS를 올바르게 사용하여 정리합니다.
다음 프로그램을 정상적으로 실행하십시오.
[profile.dev]
panic = "abort"
당신의 Cargo.toml
.
// main.rs
struct Foo(i32);
impl Drop for Foo {
fn drop(&mut self) {
println!("Dropping {:?}!", self.0);
}
}
fn main() {
let foo = Foo(1);
panic!("Aaaaaaahhhhh!");
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow